多階段構建
之前的做法:
在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 中,包括專案及其依賴庫的編譯 測試 打包等流程,這裡可能會帶來的一些問題 映象層次...