工作中發現專案在映象構建時,即使沒有修改 go.mod 也依然會執行 go mod download 來拉取依賴,而不是使用映象快取,導致每次構建時間都很長構建映象時可以使用經過排查發現是使用 arg 導致的映象快取失效
arg
指令來設定構建環境的環境變數
arg
雖然和env
指令一樣都是設定環境變數,不過arg
設定的是構建環境時的環境變數,在容器執行時不會存在這些環境變數
arg
指令可以在from
指令前指定,也可以在from
指令後使用
arg
在from
指令前指定,那麼引數只能在from
指令中使用
並且arg
的引數可以用在每個from
指令中
arg tag=1.13.0
from golang:$
run echo tag:$
from golang:$
run echo tag:$
映象構建時,from
指令會使用 tag 的值,但是run
指令並不會列印出 tag 的值
$ docker build --build-arg tag=latest --no-cache .
sending build context to docker daemon 2.048kb
step 1/5 : arg tag=1.14.0
step 2/5 : from golang:$
---> c4d6fdf2260a
step 3/5 : run echo tag:$
---> running in 9ee89387b298
tag:
removing intermediate container 9ee89387b298
---> 8cd6b2627cad
step 4/5 : from golang:$
---> c4d6fdf2260a
step 5/5 : run echo tag:$
---> running in d3f2673a7f71
tag:
removing intermediate container d3f2673a7f71
---> e1a926150795
successfully built e1a926150795
arg
在from
指令後的話,只會對當前的構建階段有效
++並且如果arg
引數的值修改,那麼後續指令都可能不會使用映象快取++
arg
可能會使快取失效這個問題就導致在使用的時候需要特別注意,如何過早的使用 arg 指令可能會使後續一些依賴拉取之類的run
指令強制執行,而不是使用之前的映象快取
構建 golang 專案時,make build
時會使用build_version
這個環境變數,所以需要在docker build
時將build_version
傳遞進去
dockerfile 為精簡版例項,不可用於生產開發
from golang:1.15.0
arg build_version
copy go.mod .
copy go.sum .
run go mod download
copy . .
run make build
問題
對於拉取依賴,只有在 go.mod,go.sum 修改時再去執行即可,其他情況應該使用映象快取
但是如果build_version
發生修改,那麼後續指令都不會使用映象快取,需要再次執行run go mod downlond
建議
arg
指令應該在接近使用的地方去執行,防止其他指令的映象快取失效
copy . .
arg build_version
run make build
使用dockerfile 構建映象
新建資料夾workdir,在資料夾中新建dockerfile檔案 此時workdir即為構建上下文,在構建映象時,docker會將構建上下文和上下文中的目錄和檔案 上傳到 docker deamon 中。要包含到映象中的檔案要放到上下文中,之後dockerfile中對檔案的複製拷貝是對上下文中的檔案...
windows 使用docker構建映象
一定要注意 先改下docker desktop的setting。不然生成映象直接 全都放到c盤。開啟cmd,到dockerfile的路徑 請把dockerfile單獨放到乙個目錄 使用docker build t image name 這個 就是當前目錄,然後就是漫長的等待。建立乙個基於某映象的容器...
使用docker構建jenkins映象並執行容器
dockerhub上有docker官方jenkins映象 同時github上有其原始碼 官方jenkins映象中所使用的jenkins是jenkins的lts long term support 發布版本。使用docker images檢視映象資訊 在home 目錄建立 jenkins home 資...