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。结果,在第四行使用的环境变量和环境变量的值在构建中是不会发生改变的。

results matching ""

    No results matching ""