本文是《docker必知必會系列》第六篇,原文發布於個人部落格:悟塵紀。如何減小所構建映象的體積最非常具有挑戰性的事情。docker 17.05版本以後,新增了dockerfile多階段構建。所謂多階段構建,實際上是允許乙個dockerfile **現多個
from
指令。
如果將所有的構建過程都包含在乙個dockerfile
中,包括專案及其依賴庫的編譯、測試、打包等流程,這樣會帶來的一些問題:
下面是乙個簡單示例:
workdir /root/構建映象:docker build -t go/helloworld:1 -f dockerfile1 .
為了解決上面提到的問題,可以採用 builder 模式:建立兩個 dockerfile,乙個用於開發(包含構建應用程式所需的一切),另乙個用於生產(僅包含您的應用程式以及執行該應用程式所需的內容),然後用編譯指令碼將其整合:
構建映象:chmod u+x build.sh && sh ./build.sh
這種方式生成的映象會很小,不過過程比較複雜,而且生成的多個映象都會占用系統空間。
為了解決這些問題,自 docker v17.05 開始支援多階段構建。每一條from
指令都是乙個構建階段,多條from
就是多階段構建,雖然最後生成的映象只能是最後乙個階段的結果,但是,能夠將前置階段中的檔案拷貝到後邊的階段中,這就是多階段構建的最大意義。示例如下:
workdir /root/第二from
條指令以alpine:latest
為基礎開始新的構建階段。copy --from=0
行僅將先前階段中構建的工件複製到新階段(第乙個from
條指令的起始編號為 0),go sdk 和任何中間工件都不會儲存在最終映象中。
接下來,使用docker build -t go/helloworld:3 .
構建映象,然後對比三種方式生成的映象大小。
docker images
repository tag image id created size
go/helloworld 3 5fb7cd98ef33 2 minutes ago 8.22mb
go/helloworld 2 7c30b66f73f9 2 minutes ago 8.22mb
go/helloworld 1 28fb4443a052 2 hours ago 401mb
可以看出,單 dockerfile 方式構建的映象非常大。後兩種方式構建的映象大小一致,但多階段構建大大降低了複雜性。
使用多階段構建:更詳細的介紹,可以參考:
docker 映象多階段構建
下面是 go 語言 hello world package main import fmt func main 接著用 alpine 1 的 go 語言 image 來編譯出可執行檔案。from golang alpine接著執行如下編譯指令 build stage from golang alpi...
docker多階段構建映象
利用docker多階段構建映象的機制,可以使構建出來的最終映象體積大大減小,從而方便傳輸 比如我們使用go語言構建程式,在編譯環境需要安裝go等一些依賴,而構建出來的二進位制檔案只需要在乙個很小的linux容器中即可執行 centos linux release 7.9.2009 core go v...
使用Docker多階段構建來減小映象大小的方法
本文講述了如何通過 docker 的多階段構建功能來大幅度減小映象大小,適用於需要在 dockerfile 中構建程式 如 j ac 且需要另外安裝編譯工具鏈的映象。如 j a 再來看一下效果 原 110m 現 92m。對比一下 dockerfile 優化前 dockerfile from open...