码头 ENV 与运行输出

假设我想合并这些命令

RUN command_1
ENV FOO bar
RUN command_2

进入

RUN command_1 && export FOO=bar && command_2

想知道用 RUN exportENV设置变量是否相等。

换句话说,Dockerfile 中的这些命令之间有区别吗?

ENV FOO bar

RUN export FOO=bar
133093 次浏览

第684期所示,export不会跨图像持久化。(不要忘记每个 Dockerfile 指令将生成一个中间容器,提交到一个中间映像中: 该映像不会保留导出值)
ENV 将:

当从结果映像运行容器时,使用 ENV设置的环境变量将保持不变。
您可以使用 docker inspect查看这些值,并使用 docker run --env <key>=<value>更改它们。

这个问题说明了这一点:

RUN export PATH=$PATH:/foo/bar # from directly in builder

当我做 docker run [img] bash -c 'echo $PATH'它从来没有包括 /foo/bar

试试看

创建一个新的 dockerfile,其中包含:

FROM centos:6
ENV FOO=foofoo
RUN export BAR=barbar
RUN export BAZ=bazbaz && echo "$FOO $BAR $BAZ"

然后构建它,最后一步的输出是:

Step 4/4 : RUN export BAZ=bazbaz && echo "$FOO $BAR $BAZ"
---> Running in eb66196b238d
foofoo  bazbaz

你可以看到:

  • 由于 ENV关键字,FOO可以通过中间容器持续存在;
  • 由于 export命令,BAR在下一步中不会持久化;
  • 正确显示 BAZ,因为该变量在同一容器上使用。

我觉得这会有帮助

RUN echo "export FOO=bar" >> /etc/bash.bashrc