docker 映象多階段構建

2021-10-08 17:50:51 字數 1578 閱讀 9853

下面是 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指令可以使用不同的基礎,並且每個指令都開始乙個新的構建。您可以選擇...