# ENV

```
ENV <key>=<value> ...
```

**ENV指令**将环境变量设置为值。此值可以用于构建阶段中所有后续指令之中，并且在许多情况下也可以[**内联替换**](https://docs.docker.com/engine/reference/builder/#environment-replacement)。该值将被解释为其他环境变量，因此如果不对引号字符进行转义，则将其删除。像命令行解析一样，引号和反斜杠可用于在值中包含空格。

示例：

```
ENV MY_NAME="John Doe"
ENV MY_DOG=Rex\ The\ Dog
ENV MY_CAT=fluffy
```

**ENV指令**允许一次设置多个变量，下面的示例将在最终镜像中产生相同的结果：

```
ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \
    MY_CAT=fluffy
```

从结果镜像运行容器时，使用**ENV**设置的环境变量将保留。我们可以使用**docker inspect**查看值，并使用**docker run --env \<key>=\<value>**&#x66F4;改它们。

```
#dockerfile

ARG VERSION=7
FROM centos:$VERSION
ENV NAME=TonyYang AGE=31 \
    ADDRESS=CHINA \
    SEX=MALE
CMD ["/bin/echo", "testing finished!"]
```

运行上面**Dockerfile**构建的镜像时的输出结果：

```bash
liuyang@liuyangdeiMac docker % docker run -it camelgem/test:v4 bash
[root@7887a9d16075 /]# env
ADDRESS=CHINA
HOSTNAME=7887a9d16075
TERM=xterm
NAME=TonyYang
```

可以看到上面的输出结果中包含了咱们之前在**Dockerfile**中定义的环境变量。

环境变量的持久性可能导致意外的副作用。例如，设置**ENV DEBIAN\_FRONTEND=noninteractive**会更改**apt-get**的行为，并可能使镜像用户感到困惑。

如果仅在构建过程中需要环境变量，而在最终的镜像中不需要，请考虑为单个命令设置一个值：

```
RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y ...
```

或使用**ARG**，因为在最终生成的镜像中不会保留**ARG**设置的变量：

```
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y ...
```

**可选语法**

**ENV指令**还允许使用另一种语法**ENV**  ，**省略了=**。例如：

```
ENV MY_VAR my-value
```

此语法不允许在单个**ENV指令**中设置多个环境变量，并且可能会造成混淆。例如，以下代码将单个环境变量**ONE**设置为**TWO= THREE=world**:

```
ENV ONE TWO= THREE=world
```

支持使用备用语法是为了实现向后兼容，但出于上述原因，不建议使用该语法，并且在将来的发行版中可能会删除该语法。
