Impact on build caching(对构建缓存的影响)

ARG变量不会像ENV变量那样持久的保存在镜像中。但是,ARG变量确实以类似的方式影响构建缓存。如果Dockerfile定义的ARG变量的值与上一次构建时定义的ARG变量的值不同,则在第一次使用Dockerfile时会发生缓存丢失(cache miss),而不是它之前定义的那样。特别是,ARG指令之后的所有RUN指令都隐示的地使用ARG变量(作为环境变量),因此也可能导致缓存丢失(cachemiss)。除非Dockerfile中有匹配的ARG语句,否则所有预先定义的ARG变量均不会进行缓存 。

例如,思考下面两个dockerfile

FROM ubuntu
ARG CONT_IMG_VER
RUN echo $CONT_IMG_VER
FROM ubuntu
ARG CONT_IMG_VER
RUN echo hello

如果我们在命令行指定--build-arg CONT_IMG_VER=<value>,上面两种情况中,第二行的声明不会导致缓存丢失(cache miss)。第三行会导致缓存丢失(cache miss)。ARG CONT_IMG_VER会导致RUN指令行被识别为与RUN CONT_IMG_VER=<value> echo hello相同的效果。因此,如果被更改,我们会得到一个缓存丢失。

在相同的命令行下考虑另外一个例子:

FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER=$CONT_IMG_VER
RUN echo $CONT_IMG_VER

在这个示例中,缓存丢失出现在第三行。丢失的发生是因为ENV中变量的值引用了ARG变量的值并且ARG变量的值在命令行中被更改了。这个示例中,ENV命令会导致镜像包含这个变量。

如果一个ENV指令用相同的名称覆盖了ARG指令,下面这样:

FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER=hello
RUN echo $CONT_IMG_VER

第三行不会造成缓存丢失,因为CONT_IMG_VER的值是常量(hello)。因为这个原因,被RUN指令使用的环境变量和它的值不会在构建的过程中被修改。

Last updated