# Environment replacement

环境变量（用**ENV**语句声明）也可以在某些指令中作为在**Dockerfile**能够被解释的变量使用。转义也可以通过将类似变量的语法实际包含在语句中来进行处理。

在**Dockerfile**中使&#x7528;**$variable\_name**&#x6216;**${variable\_name}**&#x8868;示环境变量。它们被同等对待，并且大括号语法通常用于解决变量名没有空格的问题，例&#x5982;**${foo}\_bar**。

**${variable\_name}**&#x8BED;法还支持一些标准的**bash**修饰符，如下所示：

* **${variable:-word}**&#x8868;示如果变量设置了值，那么结果将是该值。如果没有设置变量的值，则结果为**word**。
* **${variable:+word}**&#x8868;示如果变量设置了值，则**word**将为变量值，否则结果为空字符串。

  在所有情况下，**word**可以是任何字符串，甚至 可以包括其他环境变量。

可以通过在变量前添&#x52A0;**\\**&#x6765;进行转义：例如，**$foo**&#x6216;**${foo}**&#x5C06;分别转换&#x4E3A;**$foo**&#x548C;**${foo}**&#x6587;字。

示例（解析的表示形式显示&#x5728;**#**&#x540E;面）：

```
FROM busybox
ENV FOO=/bar
WORKDIR ${FOO}   # WORKDIR /bar
ADD . $FOO       # ADD . /bar
COPY \$FOO /quux # COPY $FOO /quux
```

**在Dockerfile中，以下指令列表支持环境变量：**

* **ADD**
* **COPY**
* **ENV**
* **EXPOSE**
* **FROM**
* **LABEL**
* **STOPSIGNAL**
* **USER**
* **VOLUME**
* **WORKDIR**
* **ONBUILD (该指令可以与上面的指令组合起来使用)**

对于整条指令当中的每一个变量，进行变量替换时，将使用相同的值。换句话说，在此示例中：

```
ENV abc=hello
ENV abc=bye def=$abc
ENV ghi=$abc
```

上述指令将使**def**的值为**hello**，而不是**bye**。但是，**ghi**的值将为**bye**，因为它与**abc=bye**不在同一条指令中。
