# Impact on build caching（对构建缓存的影响）

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

例如，思考下面两个**dockerfile**：

```
FROM ubuntu
ARG CONT_IMG_VER
RUN echo $CONT_IMG_VER
```

```
FROM ubuntu
ARG CONT_IMG_VER
RUN echo hello
```

如果我们在命令行指&#x5B9A;**--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指令**使用的环境变量和它的值不会在构建的过程中被修改。
