六 基於多階段構建減小映象體積降低複雜度

2021-10-05 21:55:46 字數 2083 閱讀 3805

本文是《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...