Dockerfile多階段構建

2021-10-01 04:10:17 字數 4353 閱讀 2676

多階段構建

之前的做法:

在docker17.05版本之前,構建docker映象,通常採用兩種方式:

1.全部放入乙個dockerfile

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

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

源**存在洩漏的風險

package main

import "fmt"

func main()

編寫dockerfile.one檔案

構建上面的映象

docker build -t go/helloworld:1 -f dockerfile.one .

構建完之後查下 docker image ls

輸出:repository tag image id created size

go/helloworld 1 abdac4fc2d71 18 seconds ago 260mb

啟動 docker run abdac4fc2d71 ,輸出 hello world! ,說明沒問題。

2.第二種方式就是分散到多個dockerfile

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

例子:

--------------------------

package main

import "fmt"

func main()

dockerfile.build 檔案

dockerfile.copy 檔案

--------------------------

from alpine:latest

run apk --no-cache add ca-certificates

workdir /root/

build.sh 檔案

--------------------------

echo building go/helloworld:build

docker build -t go/helloworld:build . -f dockerfile.build

docker create --name extract go/helloworld:build

docker rm -f extract

echo building go/helloworld:2

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

然後執行build.sh 這個指令碼

加個執行許可權 chmod +x build.sh

./build.sh

ps:如果是windows環境下建立的build.sh這個檔案的話,直接放到linux上會有問題,報錯會是說***檔案路徑不存在,我的這個就是,最簡答的處理方法就是 用vim開啟build.sh這個檔案,然後執行:set fileformat=unix 然後再 wq 儲存退出就行了。

看下映象 docker image ls

repository tag image id created size

go/helloworld 2 411821efb026 4 minutes ago 7.97mb

go/helloworld build e43c3b88e2c2 4 minutes ago 258mb

go/helloworld 1 abdac4fc2d71 2 hours ago 260mb

ubuntu 18.04 775349758637 4 weeks ago 64.2mb

alpine latest 965ea09ff2eb 5 weeks ago 5.55mb

hello-world latest fce289e99eb9 11 months ago 1.84kb

golang 1.9-alpine b0260be938c6 15 months ago 240mb

最上面的那個就是了,可以跑下試試:docker run 411821efb026 可以輸出hello world!

上面就是兩種之前的建立映象的方式,接下來的筆記是關於 多階段構建的 docker v17.05之後開始支援多階段構建(multistage builds)

dockerfile 檔案

開始構建 docker build -t go/helloworld:3 .

跑下試試:docker run 0186e09ebd69 可以跑出來hello world!

對比**積看看 docker image ls

repository tag image id created size

go/helloworld 3 0186e09ebd69 36 seconds ago 7.97mb

go/helloworld 2 411821efb026 55 minutes ago 7.97mb

go/helloworld build e43c3b88e2c2 55 minutes ago 258mb

go/helloworld 1 abdac4fc2d71 3 hours ago 260mb

tag為3的這個映象非常小。

只構建某一階段的映象

使用 as 來為某一階段命名,例如 from golang:1.9-alpine as builder

如當只想構建 builder 階段的映象時,增加 --target=builder 引數即可

docker build --target builder -t username/imagename:tag .

構建時從其他映象複製檔案 使用 copy --from=0

例子:copy --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf

Dockerfile多階段構建

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

Dockerfile 多階段構建

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

Dockerfile 多階段構建(9)

使用多階段構建 只構建某一階段的映象 構建時從其他映象複製檔案 在 docker 17.05 版本之前,我們構建 docker 映象時,通常會採用兩種方式 一種方式是將所有的構建過程編包含在乙個 dockerfile 中,包括專案及其依賴庫的編譯 測試 打包等流程,這裡可能會帶來的一些問題 映象層次...