ARG对构建缓存的影响
ARG
变量不会像ENV
变量持久化的存储在镜像当中。尽管,ARG
变量会以同样的方式影响构建缓存。如果一个Dockerfile使用了不同于之前的ARG
变量的值,那么就会出现一次缓存未命中。在特殊的情况下,所有在ARG
命令之后并且使用了ARG
变量的RUN
指令都会出现缓存未命中。所有预定义的ARG
变量被免除缓存,除非在Dockerfile当中匹配到了ARG
状态。
例如,考虑下面两个Dockerfile:
1 FROM ubuntu
2 ARG CONT_IMG_VER
3 RUN echo $CONT_IMG_VER
1 FROM ubuntu
2 ARG CONT_IMG_VER
3 RUN echo hello
如果你在命令行当中指定--build-arg CONT_IMG_VER=<value>
,在任何情况下,第2行不会造成缓存未命中;第3行会缓存未命中。ARG CONT_IMG_VER
使RUN的那行与CONT_IMG_VER=<value>
echo hello相同,所以如果<value>
改变了,那么我们就会缓存未命中。
考虑另一个例子:
1 FROM ubuntu
2 ARG CONT_IMG_VER
3 ENV CONT_IMG_VER $CONT_IMG_VER
4 RUN echo $CONT_IMG_VER
在这种情况下,缓存未命中会出现在第3行。这个未命中是因为变量ENV
的值引用了变量ARG
的值,并且变量的值被命令行所改变了,ENV
命令造成镜像要包括这个值。
如果一个ENV
命令对ARG
命令进行了同名覆盖,像这个Dockerfile:
1 FROM ubuntu
2 ARG CONT_IMG_VER
3 ENV CONT_IMG_VER hello
4 RUN echo $CONT_IMG_VER
第3行不会造成变量未命中因为CONT_IMG_VER
的值是常量hello
。结果,在第四行使用的环境变量和环境变量的值在构建中是不会发生改变的。