我們在構建docker映象時,希望最後得到的映象越小越好,但是在構建時,總是會用到各種各樣複雜的環境,大部分都是臨時環境,只是為了生成對應的目標程式。比如我們經常會在opencv環境下編譯影象處理類程式,但其實目標程式只需要用的之前生成的子程式就行,不需要引入中間用到的環境。這裡我們就能用到dockerfile多階段構建,它可以把前面多個階段生成的檔案拷貝到下乙個階段使用,並且不引入之前用到的環境,這極大地解耦了我們的dockerfile檔案,而且最終可以得到乙個極小的完整映象。
關於映象構建,最重要的事情之一就是讓映象容量盡可能的變得更小,dockerfile中的每條指令都會新增一層映象,我們需要在進入下一層時清除之後用不到的檔案。
在多階段構建中,我們可以通過from
指令在dockerfile中生成多個階段。每個from指令可以使用不同的base映象,並且每個指令都開始構建的新階段,您可以把前乙個階段生成的檔案copy到另乙個階段,從而在最終的映象中只留下需要的所有內容,下面通過乙個例子來實踐一下多階段構建的方法。
workdir /root/通過build上面的dockerfile檔案,我們可以得到乙個微型的映象,第二條from指令以alpine:latest
映象作為基礎映象開始新的構建階段,copy --from=0
命令可以將之前階段的檔案複製到這個新階段。golang sdk和其它臨時檔案都留在了第乙個stage,沒有儲存到最終的映象中,這極大的降低了dockerfile的複雜度和減小了映象的大小。
預設情況下,未命名的階段,您可以通過其整數編號來引用它們,第一from條指令的起始編號為0。但是,您還可以通過as
在from指令中新增來命名階段。下面的示例通過給階段命名並在copy指令中使用名稱來引用前乙個階段的檔案。這意味著,即使以後對dockerfile中的指令進行了重新排序,它們也能正常的構建執行。
workdir /root/構建映像時,不必構建整個dockerfile,即所有的階段。您可以指定目標構建階段。以上面的dockerfile為例,我們可以通過以下命令只構建第乙個階段。
docker build --target yeqiongzhou -t yeqiongzhou/docker-multistage-build:latest .使用多階段構建時,您不僅可以之前在dockerfile中建立的階段進行拷貝。您可以使用這個方法可以在除錯測試階段發揮很大的作用。
copy --from
指令從外部的映象進行拷貝操作。
copy --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf注
dockerfile中&&
運算子可以人為地將兩個命令壓縮在一起,以避免在映象中建立額外的映象層。另外如果命令比較長時不要忘記使用\
字元分隔命令列。
Dockerfile多階段構建
多階段構建 之前的做法 在docker17.05版本之前,構建docker映象,通常採用兩種方式 1.全部放入乙個dockerfile 一種方式是將所有的構建過程全都包含在乙個dockerfile中,包括專案及其依賴庫的編譯 測試 打包流程,這裡會帶來的一些問題 映象層次多,映象體積較大,部署時間變...
Dockerfile 多階段構建
之前的做法 在 docker 17.05 版本之前,我們構建 docker 映象時,通常會採用兩種方式 一種方式是將所有的構建過程編包含在乙個 dockerfile 中,包括專案及其依賴庫的編譯 測試 打包等流程,這裡可能會帶來的一些問題 dockerfile 特別長,可維護性降低 映象層次多,映象...
Dockerfile 多階段構建(9)
使用多階段構建 只構建某一階段的映象 構建時從其他映象複製檔案 在 docker 17.05 版本之前,我們構建 docker 映象時,通常會採用兩種方式 一種方式是將所有的構建過程編包含在乙個 dockerfile 中,包括專案及其依賴庫的編譯 測試 打包等流程,這裡可能會帶來的一些問題 映象層次...