映象構建時使用 ARG 導致映象快取失效

2021-10-10 07:40:13 字數 2316 閱讀 5387

工作中發現專案在映象構建時,即使沒有修改 go.mod 也依然會執行 go mod download 來拉取依賴,而不是使用映象快取,導致每次構建時間都很長

經過排查發現是使用 arg 導致的映象快取失效

構建映象時可以使用arg指令來設定構建環境的環境變數

arg雖然和env指令一樣都是設定環境變數,不過arg設定的是構建環境時的環境變數,在容器執行時不會存在這些環境變數

arg指令可以在from指令前指定,也可以在from指令後使用

argfrom指令前指定,那麼引數只能在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

argfrom指令後的話,只會對當前的構建階段有效

++並且如果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 資...