当应用 Dockerfile 进行构建镜像时,有时会须要设置容器内的环境变量。
ENV
指令的格局如下:
ENV <key>=<value> ...
ENV
指令将环境变量 <key>
设置为值 <value>
。这个值将在构建阶段的所有后续指令的环境中,
也能够被替换应用在其余指令中。
该值将被解释为其余环境变量,因而如果引号字符没有本义,它们将被删除。像命令行解析一样,引号和反斜杠能够用于在值中蕴含空格。
例如:
ENV MY_NAME="John Doe"
ENV MY_DOG=Rex\ The\ Dog
ENV MY_CAT=fluffy
ENV
指令容许多个 <key>=<value> ...
变量同时设置,上面的例子将在生成的镜像中产生雷同的后果:
ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \
MY_CAT=fluffy
当应用生成的镜像运行容器时,应用 ENV
设置的环境变量将长久存在于容器内。
你能够应用 docker inspect
查看这些值,并应用 docker run --env <key>=<value>
批改它们。
环境变量持久性可能会导致意想不到的副作用。
例如,设置 ENV DEBIAN_FRONTEND=noninteractive
会扭转 apt-get
的行为,并可能让应用镜像的用户感到困惑。
如果只在构建过程中须要环境变量,而不是在最终镜像中,请思考为单个命令设置一个值:
RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y ...
或者应用 ARG
,它不会在最终镜像中长久存在:
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y ...
代替语法
ENV
指令还容许另一种语法ENV <key> <value>
,省略了两头的等号。例如:ENV MY_VAR my-value
这种语法不容许在一条
ENV
指令中设置多个环境变量,可能会造成混同。例如,上面的代码设置了一个值为“TWO= THREE=world”的环境变量(ONE):ENV ONE TWO= THREE=world
反对这种代替语法为了向后兼容,但因为上述起因不激励应用,可能会在未来的版本中删除。
原文链接:https://goworker.cn/posts/dockerfile-env/