假设我想要结合这些命令
RUN command_1
ENV FOO bar
RUN command_2
到
RUN command_1 && export FOO=bar && command_2
并且想知道将RUN export
与ENV
设置变量是否相同。
换句话说,这些命令在Dockerfile中有区别吗?
ENV FOO bar
VS
RUN export FOO=bar
答案 0 :(得分:70)
如issue 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
你可以看到:
FOO
关键字,ENV
会通过中间容器持续存在
由于BAR
命令,export
不会继续执行下一步; BAZ
已正确显示,因为该变量用于同一容器。