2017-01-11 21 views
4

如果在Dockerfile頂部聲明的ARG被更改,但其值僅用於靠近Dockerfile末尾的RUN命令,Docker會從頭開始重建整個映像,還是可以重新使用相關RUN命令之前的中間圖像?將ARG放在Dockerfile的頂部防止層重用?

爲了更好地利用分層,我應該將ARG聲明放在Dockerfile的頂部,還是放置在使用它們的部分之前?

我想我的問題的一部分是否ARG指令生成中間層。

回答

4

如果更改構建參數的值,則該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層本身)從緩存中使用。

相關問題