在代理后面的 vagrant 中使用 docker

Using docker within vagrant behind a proxy

我想从 docker 容器中的 运行 apt,在流浪机器中(运行ning 在 vi​​rtualbox 上),但这失败了,因为我在代理后面。

我使用 vagrant-proxyconf 让 vagrant 机器本身连接到互联网,效果很好:

if Vagrant.has_plugin?("vagrant-proxyconf")
  config.proxy.http     = ...
  config.proxy.https    = ...
  config.proxy.no_proxy = "localhost,127.0.0.1,.example.com"
end

但是,这些设置不会传递到在 vagrant 机器中启动的 docker 容器。当我使用

启动基于 debian 的 docker 容器时
docker run -it debian /bin/bash

并且在 bash 我 运行

apt-get update

那么apt无法建立连接。我可以通过将以下内容添加到我的 Dockerfile

来解决这个问题
ENV http_proxy <myproxy>

但是调整所有 Dockerfile 会很麻烦,我不希望将我的代理硬编码到 Dockerfile 本身,因为它们也在不同的设置中使用。

我也试过告诉 docker 使用什么代理:https://docs.docker.com/engine/admin/systemd/

然而,这似乎对 apt 在 docker 容器中使用的代理没有任何影响。

有没有办法将 http_proxy 环境变量传递给默认情况下在我的机器中启动的所有 docker 容器?或者,是否可以将 vagrant / virtualbox 配置为 "emulate" "proxyless" 互联网连接,这样我就不必通过所有虚拟化层访问代理设置?

您可以添加将它们作为参数传递给 docker 构建命令的变量。这样它就可以工作并且代理 ip 不会在 Dockerfile 上。这样:

docker build -t --build-arg http_proxy="http://yourIp" yourImage 

然后在 Dockerfile 上,您必须将 var 设置为参数:

ARG http_proxy

可以自动以这种方式使用 var:

RUN echo ${http_proxy}

但在你的情况下你不需要使用它,只设置代理变量就足以在构建过程中使用。

为了避免在 Dockerfile 上写入密码,此技术也可能非常有用。

希望对您有所帮助