
當(dāng)使用 Dockerfile 進(jìn)行構(gòu)建鏡像時(shí),有時(shí)會(huì)需要設(shè)置容器內(nèi)的環(huán)境變量。
ENV 指令的格式如下:
ENV <key>=<value> ...
ENV 指令將環(huán)境變量 <key> 設(shè)置為值 <value>。這個(gè)值將在構(gòu)建階段的所有后續(xù)指令的環(huán)境中,
也可以被替換使用在其他指令中。
該值將被解釋為其他環(huán)境變量,因此如果引號(hào)字符沒有轉(zhuǎn)義,它們將被刪除。像命令行解析一樣,引號(hào)和反斜杠可以用于在值中包含空格。
例如:
ENV MY_NAME="John Doe"
ENV MY_DOG=Rex\ The\ Dog
ENV MY_CAT=fluffy
ENV 指令允許多個(gè) <key>=<value> ... 變量同時(shí)設(shè)置,下面的例子將在生成的鏡像中產(chǎn)生相同的結(jié)果:
ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \
MY_CAT=fluffy
當(dāng)使用生成的鏡像運(yùn)行容器時(shí),使用 ENV 設(shè)置的環(huán)境變量將持久存在于容器內(nèi)。
你可以使用 docker inspect 查看這些值,并使用 docker run --env <key>=<value> 修改它們。
環(huán)境變量持久性可能會(huì)導(dǎo)致意想不到的副作用。
例如,設(shè)置 ENV DEBIAN_FRONTEND=noninteractive 會(huì)改變 apt-get 的行為,并可能讓使用鏡像的用戶感到困惑。
如果只在構(gòu)建過程中需要環(huán)境變量,而不是在最終鏡像中,請(qǐng)考慮為單個(gè)命令設(shè)置一個(gè)值:
RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y ...
或者使用 ARG,它不會(huì)在最終鏡像中持久存在:
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y ...
替代語法
ENV指令還允許另一種語法ENV <key> <value>,省略了中間的等號(hào)。例如:ENV MY_VAR my-value這種語法不允許在一條
ENV指令中設(shè)置多個(gè)環(huán)境變量,可能會(huì)造成混淆。例如,下面的代碼設(shè)置了一個(gè)值為“TWO= THREE=world”的環(huán)境變量(ONE):ENV ONE TWO= THREE=world支持這種替代語法為了向后兼容,但由于上述原因不鼓勵(lì)使用,可能會(huì)在將來的版本中刪除。