我在公司网络环境中使用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
1条答案
按热度按时间cetgtptt1#
Dockerfile中的每个RUN命令都会启动一个新的shell,所以当你调用
RUN source /etc/environment
时,这个shell的环境已经设置好了,但是对于下一个RUN apt-get update
,一个新的shell会启动,它有一个新的环境,没有你的http_proxy变量。在这些情况下的惯例是使用ENV指令,就像你在问题开始时提到的那样。但是如果你确定你想使用
/etc/environment
文件,你可以这样使用它: