source /etc/environment :构建 Docker 镜像时环境变量不刷新

source /etc/environment : Environment variables are not refreshing when building Docker image

提问人:sabri mahmoud 提问时间:2/1/2023 更新时间:2/2/2023 访问量:557

问:

我在企业网络环境中使用 Docker 时遇到了一个挑战。为了克服网络限制,我配置了 Docker 守护程序的 DNS,如此堆栈问题中所述。此外,我在 Docker 映像中设置了代理环境变量,如下所示:

ENV http_proxy = http://login:[email protected]:1111
ENV https_proxy = http://login:[email protected]:1111
ENV ftp_proxy = http://login:[email protected]:1111
ENV no_proxy = 127.0.0.1, z.z.z.z , y.y.y.y, x.x.x.x,localhost

通过这样做,我成功地绕过了apt-get,但这里的问题是,当我尝试使用以下形式的命令在/etc/environment的bside中编写代理参数来执行此操作时:

RUN echo "\nexport http_proxy = http://login:[email protected]:1111\nexport https_proxy = ... etc" >> /etc/environment

为了刷新环境变量,我通过添加此行来遵循此堆栈问题,将默认 shell 从 /bin/sh 更改为 /bin/bash 请注意,这是必需的,否则您将收到错误 /bin/sh source command not found

SHELL ["/bin/bash", "-c"]
RUN source /etc/environment  

然后检查是否发生了刷新,我只是输入

env | grep proxy 

没有代理配置,我无法执行**运行apt-get update**

请注意,如果我运行容器并执行此刷新命令

source /etc/environment

然后执行 apt-get 更新,一切顺利!!
我真的不明白问题到底是什么,谢谢你给出任何解释。

感谢您的阅读。

版本:

  • Docker 版本 20.10.23
  • Kubuntu 22.04 LTS
docker dockerfile 环境变量 刷新

评论

0赞 David Maze 2/2/2023
从 Docker 中的文件中读取环境变量可能很棘手。使用 Dockerfile 比尝试将值写入通常不会被读取的 shell dotfile 更容易。ENV
0赞 sabri mahmoud 2/2/2023
感谢您的回复 @David,是的,我想这就是我正在做的,写知道,但我试图按照下面的回复中所说的去做,我猜 docker 甚至无法执行源代码 /etc/environment,因为它忽略了 && 之后的 apt-get 安装
0赞 Chris Becke 2/2/2023
如果希望代理设置可用于后续的 dockerfiler RUN 命令,请使用 代替 。 将环境变量注入 Dockerfiles 构建环境(即执行每个 RUN 命令的环境)。ENV 将 env 环境变量添加到运行时环境(为启动容器的 CMD 指令提供的环境)。ARGENVARG

答:

0赞 MohammadAmin Salarkia 2/2/2023 #1

Dockerfile 中的每个 RUN 命令都会启动一个新的 shell。因此,当您调用 The environment is set for this shell, but for the next for the next 时,将启动一个新 shell,并且它有一个没有 http_proxy 变量的新环境。RUN source /etc/environmentRUN apt-get update

在这些情况下,惯例是使用 ENV insturction,就像您在问题开头提到的一样。但是,如果您确定要使用文件,则可以像这样使用它:/etc/environment

RUN source /etc/environment && apt-get update

评论

0赞 sabri mahmoud 2/2/2023
感谢您@MohammadAmineSalarkia的回复,这里的问题是 source /etc/environment 命令没有刷新,所以在条件 && 的情况下,你把 docker-daemon 甚至不会查看 && 之后的内容,此外,该命令确实是为特定 shell 设置的,但请注意“RUN 指令将在当前映像顶部的新层中执行任何命令并提交结果。生成的提交映像将用于 Dockerfile 中的下一步“,如 Dockerfile 参考中所述