下面是 go 語言 hello world **:
package main
import
"fmt"
func main(
)
接著用 alpine[1] 的 go 語言 image 來編譯出可執行檔案。
from golang:alpine
接著執行如下編譯指令:
# build stage
from golang:alpine as build-env
add . /src
# final stage
from alpine
從上面可以看到透過as和–from互相溝通,以前需要寫兩個 dockerfile,現在只要乙個就可以搞定。
會發現最後大小為 6.35 mb,比上面是不是小了很多
6.35 mb 是最小的 image 了嗎?乙個簡單的 hello world 可執行檔案,用 docker 包起來竟然要 6.35,其實不用這麼大,我們可以透過 dokcer 所提供的最小 image:scratch[2],將二進位制檔案直接扔進去即可,在編譯可執行檔案時需加入特定引數才可以:
在通過 docker 包起來:
from centurylink/ca-certs
entrypoint [
]
編譯出來大小為:1.81mb,相信這是最小的 image 了。
注:centurylink/ca-certs 是乙個基於 docker 的基礎映象,它基於 scratch[3] 映象構建,並為所有標準證書頒發機構新增了根證書。
完整的 dockerfile:
# build stage
from golang:alpine as build-env
add . /src
# final stage
from centurylink/ca-certs
entrypoint [
]
總結
multiple build 非常方便,這樣就可以將多個步驟全部合併在乙個 dockerfile 處理掉,像是底下例子:
from debian as build-essential
arg apt_mirror
run apt-get update
run apt-get
install -y make gcc
workdir /src
from build-essential as foo
copy src1 .
run make
from build-essential as bar
copy src2 .
run make
from alpine
copy --from=foo bin1 .
copy --from=bar bin2 .
cmd ...
用乙個 dockerfile 產生多個可執行檔案,最後再用 alpine 打包成 image。 docker多階段構建映象
利用docker多階段構建映象的機制,可以使構建出來的最終映象體積大大減小,從而方便傳輸 比如我們使用go語言構建程式,在編譯環境需要安裝go等一些依賴,而構建出來的二進位制檔案只需要在乙個很小的linux容器中即可執行 centos linux release 7.9.2009 core go v...
Docker多階段構建
在 docker 17.05 版本之前,我們構建 docker 映象時,通常會採用兩種方式 一種方式是將所有的構建過程編包含在乙個 dockerfile 中,包括專案及其依賴庫的編譯 測試 打包等流程,這裡可能會帶來的一些問題 package main import fmt func main 編寫...
docker 多階段構建
構建映象最具挑戰性的一點是使映象大小盡可能的小。dockerfile中的每條指令都為影象新增了乙個圖層,您需要記住在移動到下一層之前清理任何不需要的工件。對於多階段構建,您可以在dockerfile中使用多個from語句。每個from指令可以使用不同的基礎,並且每個指令都開始乙個新的構建。您可以選擇...