Docker基礎——鏡像構建最佳實踐

????使用以上命令可以讓我們看到已經被用來創(chuàng)建容器的image每層內部的具體信息:
????
每一行輸出代表著image中的每一層,從上到下依次是最下游到最上游,詳細的分層數據有助于幫助我們診斷image體積過大的問題。
? ? 我們可以看到Docker file中的每一個命令會在image中形成一個新的層,根據Docker的規(guī)定當鏡像中的層有變化時其下游必須重建,然而在上述示例的場景中重復的 yarn install是無意義的,所以我們可以盡可能規(guī)避變化帶來的影響:?
????
上述代碼將之前的一次COPY操作改為了兩次,第一次COPY只將package.json和鎖定文件復制到了容器內部,用以支持下一步的install操作,在install之后在復制其余的文件。也就是說上述示例將文件的變化隔離到了兩層:當package.json文件變化是才重新執(zhí)行install;當package.json之外的文件變化時只重新拷貝文件。
? ? 我們可以使用.dockerignore忽略不必要被拷貝的文件,以此進一步減小COPY動作的開銷,比如node_modules。
? ? 經過以上改造當我們因為變更重新執(zhí)行 docker build 命令時未受影響的層都將沿用老的鏡像層,只對變更影響的部分進行重建。
? ? 如果我們使用服務端渲染大多數生產環(huán)境中我們都不需要在容器中加入node環(huán)境,我們可以通過二次構建將node環(huán)境剝離,使鏡像中只存在前端構建產物而不存在構建依賴。
????上述示例中第一階段先試用node環(huán)境構建出前端產物,第二階段將第一階段的構建產物加入真實構建出的鏡像中,在構建出的image中只存在第二階段所描述的內容。