4
如果在Dockerfile頂部聲明的ARG被更改,但其值僅用於靠近Dockerfile末尾的RUN命令,Docker會從頭開始重建整個映像,還是可以重新使用相關RUN命令之前的中間圖像?將ARG放在Dockerfile的頂部防止層重用?
爲了更好地利用分層,我應該將ARG聲明放在Dockerfile的頂部,還是放置在使用它們的部分之前?
我想我的問題的一部分是否ARG指令生成中間層。
如果在Dockerfile頂部聲明的ARG被更改,但其值僅用於靠近Dockerfile末尾的RUN命令,Docker會從頭開始重建整個映像,還是可以重新使用相關RUN命令之前的中間圖像?將ARG放在Dockerfile的頂部防止層重用?
爲了更好地利用分層,我應該將ARG聲明放在Dockerfile的頂部,還是放置在使用它們的部分之前?
我想我的問題的一部分是否ARG指令生成中間層。
如果更改構建參數的值,則該ARG行之後的所有圖層都將失效。所以我想你應該在使用ARG之前加入它。
就在你需要它:
docker build --build-arg TEST_ARG=test .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM ubuntu
---> 104bec311bcd
Step 2 : RUN echo "no arg used"
---> Using cache
---> 5c29cb363a27
Step 3 : ARG TEST_ARG
---> Using cache
---> 73b6080f973b
Step 4 : RUN echo $TEST_ARG
---> 0acd55c24441
Successfully built 0acd55c24441
在頂部:
docker build --build-arg TEST_ARG=test .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM ubuntu
---> 104bec311bcd
Step 2 : ARG TEST_ARG
---> Using cache
---> b611a1023fe3
Step 3 : RUN echo "no arg used"
---> Running in 63e0f803c6b2
no arg used
---> 592311ccad72
Removing intermediate container 63e0f803c6b2
Step 4 : RUN echo $TEST_ARG
---> Running in 1515aa8702f0
test
---> fc2d850fbbeb
Removing intermediate container 1515aa8702f0
Successfully built fc2d850fbbeb
在第一個例子兩層從緩存中,並在第二個只有一層使用(有趣的是,ARG層本身)從緩存中使用。