Dockerfile 多階段構建(9)

2021-10-20 17:22:15 字數 4090 閱讀 1127

使用多階段構建

只構建某一階段的映象

構建時從其他映象複製檔案

在 docker 17.05 版本之前,我們構建 docker 映象時,通常會採用兩種方式:

一種方式是將所有的構建過程編包含在乙個 dockerfile 中,包括專案及其依賴庫的編譯、測試、打包等流程,這裡可能會帶來的一些問題:

映象層次多,映象體積較大,部署時間變長

源**存在洩露的風險

下面展示一些內聯**片

package main

import

"fmt"

func main()

下面展示一些內聯**片

編寫 dockerfile.one 檔案
from golang:

]

下面展示一些內聯**片

構建映象
$ docker build -t go/helloworld:

1-f dockerfile.one .

另一種方式,就是我們事先在乙個 dockerfile 將專案及其依賴庫編譯測試打包好後,再將其拷貝到執行環境中,這種方式需要我們編寫兩個 dockerfile 和一些編譯指令碼才能將其兩個階段自動整合起來,這種方式雖然可以很好地規避第一種方式存在的風險,但明顯部署過程較複雜。

下面展示一些內聯**片

例如,編寫 dockerfile.build 檔案
from golang:

goos

下面展示一些內聯**片

編寫 dockerfile.copy 檔案
from alpine:latest

run apk --no-cache add ca-certificates

workdir

/root/

cmd[

]

下面展示一些內聯**片

新建 build.sh
#!

/bin/sh

echo building go/helloworld:build

docker build -t go/helloworld:build .

-f dockerfile.build

docker create --name extract go/helloworld:build

docker cp extract:

docker rm -f extract

echo building go/helloworld:

2docker build --no-cache -t go/helloworld:2.

-f dockerfile.copy

rm .

下面展示一些內聯**片

現在執行指令碼即可構建映象
$ chmod +x build.sh

$ ./build.sh

下面展示一些內聯**片

對比兩種方式生成的映象大小
$ docker image ls

repository

tagimage

idcreated

size

go/helloworld 2 f7cf3465432c 22 seconds ago 6.47mb

go/helloworld 1 f55d3e16affc 2 minutes ago 295mb

為解決以上問題,docker v17.05 開始支援多階段構建 (multistage builds)。使用多階段構建我們就可以很容易解決前面提到的問題,並且只需要編寫乙個 dockerfile:

下面展示一些內聯**片

例如,編寫 dockerfile 檔案
from golang:

]

下面展示一些內聯**片

構建映象
$ docker build -t go/helloworld:

3.

下面展示一些內聯**片

對比三個映象大小
$ docker image ls

repository

tagimage

idcreated

size

go/helloworld 3 d6911ed9c846 7 seconds ago 6.47mb

go/helloworld 2 f7cf3465432c 22 seconds ago 6.47mb

go/helloworld 1 f55d3e16affc 2 minutes ago 295mb

很明顯使用多階段構建的映象體積小,同時也完美解決了上邊提到的問題。

下面展示一些內聯**片

我們可以使用 as 來為某一階段命名,例如
from golang:

1.9-alpine as builder

下面展示一些內聯**片

例如當我們只想構建 builder 階段的映象時,增加 --target=builder 引數即可
$ docker build --target builder -t username/imagename:tag .
下面展示一些內聯**片

$ copy

--from

=nginx:latest /etc/nginx/nginx.conf /nginx.conf

Dockerfile多階段構建

多階段構建 之前的做法 在docker17.05版本之前,構建docker映象,通常採用兩種方式 1.全部放入乙個dockerfile 一種方式是將所有的構建過程全都包含在乙個dockerfile中,包括專案及其依賴庫的編譯 測試 打包流程,這裡會帶來的一些問題 映象層次多,映象體積較大,部署時間變...

Dockerfile多階段構建

我們在構建docker映象時,希望最後得到的映象越小越好,但是在構建時,總是會用到各種各樣複雜的環境,大部分都是臨時環境,只是為了生成對應的目標程式。比如我們經常會在opencv環境下編譯影象處理類程式,但其實目標程式只需要用的之前生成的子程式就行,不需要引入中間用到的環境。這裡我們就能用到dock...

Dockerfile 多階段構建

之前的做法 在 docker 17.05 版本之前,我們構建 docker 映象時,通常會採用兩種方式 一種方式是將所有的構建過程編包含在乙個 dockerfile 中,包括專案及其依賴庫的編譯 測試 打包等流程,這裡可能會帶來的一些問題 dockerfile 特別長,可維護性降低 映象層次多,映象...