docker ENV vs RUN导出

Use*_*159 55 docker

假设我想要结合这些命令

RUN command_1
ENV FOO bar
RUN command_2
Run Code Online (Sandbox Code Playgroud)

RUN command_1 && export FOO=bar && command_2
Run Code Online (Sandbox Code Playgroud)

并且想知道用RUN exportvs 设置变量ENV是否相同.

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

ENV FOO bar
Run Code Online (Sandbox Code Playgroud)

VS

RUN export FOO=bar
Run Code Online (Sandbox Code Playgroud)

Von*_*onC 100

问题684所示,export不会持续跨图像.(不要忘记每个Dockerfile指令将生成一个中间容器,提交到中间图像:该图像不会保留导出的值)
ENV将:

ENV当从生成的图像运行容器时,使用的环境变量将保持不变.
您可以使用docker inspect和查看值,并使用它们进行更改docker run --env <key>=<value>.

这个问题说明了:

RUN export PATH=$PATH:/foo/bar # from directly in builder
Run Code Online (Sandbox Code Playgroud)

当我这样做时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"
Run Code Online (Sandbox Code Playgroud)

然后建立它.最后一步的输出是:

Step 4/4 : RUN export BAZ=bazbaz && echo "$FOO $BAR $BAZ"
 ---> Running in eb66196b238d
foofoo  bazbaz
Run Code Online (Sandbox Code Playgroud)

你可以看到:

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


小智 5

我认为这会有所帮助

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

  • 通过额外的支持信息可以改进您的答案。请[编辑]添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以[在帮助中心](/help/how-to-answer)找到有关如何写出好的答案的更多信息。 (3认同)
  • 大多数运行 Docker 容器的路径不会读取 `.bashrc` 或其他 shell 点文件;向这些文件添加行通常没有效果。 (3认同)