> For the complete documentation index, see [llms.txt](https://camelgemonion.gitbook.io/docker/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://camelgemonion.gitbook.io/docker/dockerfile-zhi-ling/arg/using-arg-variables-shi-yong-arg-bian-liang.md).

# Using ARG Variables（使用ARG变量）

我们可以使用**ARG**或**ENV指令**来指定**RUN指令**可用的变量。使用**ENV指令**定义的环境变量始终覆盖同名**ARG指令**。思考下面这个**Dockerfile**与**ENV**和**ARG指令**。

```
FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER=v1.0.0
RUN echo $CONT_IMG_VER
```

假设这个镜像通过下面这个命令构建：

```bash
$ docker build --build-arg CONT_IMG_VER=v2.0.1 .
```

在这种情况下，**RUN指令**使用值**v1.0.0**而不是**ARG**设置的由用户传递的值**v2.0.1**。这种行为类似于**shell**脚本，从定义一个本地作用域变量的地方开始，它会覆盖作为参数传递的变量或者从环境中继承的变量。

使用上面的例子，但不同的**ENV**定义，我们可以在**ARG**和**ENV指令**之间创建更有用的交互：

```
FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER=${CONT_IMG_VER:-v1.0.0}
RUN echo $CONT_IMG_VER
```

与**ARG指令**不同，**ENV**值总是会保存在构建的镜像中。思考下面不&#x5E26;**--build-arg**选项标志的示例：

```bash
$ docker build .
```

在上面的示例中，**CONT\_IMG\_VER**仍然保存在镜像中，但是它的值为**v1.0.0**。因为第三行的**ENV指令**为它设置了一个默认值。

本示例中的变量扩展技术允许我们通过命令行中的参数，并通过**ENV指**令将它们保存在到最终的镜像中。但是变量扩展仅支持有限的[**Dockerfile指令集**](https://docs.docker.com/engine/reference/builder/#environment-replacement)。
