源/etc/环境:构建Docker映像时环境变量未刷新

nszi6y05  于 2023-02-03  发布在  Docker
关注(0)|答案(1)|浏览(123)

我在公司网络环境中使用Docker时遇到了一个挑战。为了克服网络限制,我按照this Stack issue中所述配置了Docker守护程序的DNS。此外,我还在Docker映像中设置了代理环境变量,如下所示:

ENV http_proxy = http://login:pass@proxy-server.fr:1111
ENV https_proxy = http://login:pass@proxy-server.fr:1111
ENV ftp_proxy = http://login:pass@proxy-server.fr: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中写入代理参数时:

RUN echo "\nexport http_proxy = http://login:pass@proxy-server.fr:1111\nexport https_proxy = ... etc" >> /etc/environment

为了刷新环境变量,我在Stack issue之后添加了以下行,将默认shell从**/bin/sh更改为/bin/bash请注意,这是必需的,否则将收到错误/bin/sh source command not found**

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

然后,为了检查是否发生了刷新,我只需键入

env | grep proxy

没有代理配置,因此我无法执行RUN apt-get update
注意如果我运行容器并执行这个刷新命令

source /etc/environment

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

版本:

  • Docker版本20.10.23
  • 库班图22.04 LTS
cetgtptt

cetgtptt1#

Dockerfile中的每个RUN命令都会启动一个新的shell,所以当你调用RUN source /etc/environment时,这个shell的环境已经设置好了,但是对于下一个RUN apt-get update,一个新的shell会启动,它有一个新的环境,没有你的http_proxy变量。
在这些情况下的惯例是使用ENV指令,就像你在问题开始时提到的那样。但是如果你确定你想使用/etc/environment文件,你可以这样使用它:

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

相关问题