Woo*_*low 18 docker dockerfile
如果在Dockerfile顶部声明的ARG发生更改,但其值仅用于Dockerfile末尾附近的RUN命令,Docker是否从头开始重建整个映像,或者是否能够重用中间件在相关的RUN命令之前的图像?
为了更好地利用分层,我应该将我的ARG声明放在Dockerfile的顶部,还是在使用它们的部分之前?
我想我的一部分问题是ARG指令是否生成了一个中间层.
Bro*_*ale 20
比接受的响应更准确,并非所有行都在ARG声明后缓存无效。只有那些使用ARGvalues 和RUNs 的。码头工人文档的详细信息:
对构建缓存的影响
ARG变量不会像ENV变量那样持久化到构建的映像中。但是,ARG变量确实以类似的方式影响构建缓存。如果 Dockerfile 定义了一个 ARG 变量,其值与之前的构建不同,那么“缓存未命中”发生在它第一次使用时,而不是它的定义。特别是,RUN一条指令后面的所有指令都隐式地ARG使用该ARG变量(作为环境变量),因此可能导致缓存未命中。ARG除非ARGDockerfile 中有匹配的语句,否则所有预定义的变量都免于缓存。
您必须将ARGs移到RUN不需要参数的s 下,以保持图层缓存优化。
欲了解更多信息:
eaw*_*den 15
如果更改构建参数的值,则该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
Run Code Online (Sandbox Code Playgroud)
在顶部:
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
Run Code Online (Sandbox Code Playgroud)
在第一个例子中,从缓存使用两个层,在第二个例子中,只使用一个层(有趣的是,ARG层本身)来自缓存.
| 归档时间: |
|
| 查看次数: |
3247 次 |
| 最近记录: |