docker - 在代理后面的 vagrant 中使用 docker

标签 docker proxy vagrant http-proxy

我想在 docker 容器中运行 apt,在 vagrant 机器中(在 virtualbox 上运行),但这失败了,因为我在代理后面。

我使用 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 配置为“模拟”“无代理”互联网连接,这样我就不必通过所有虚拟化层访问代理设置?

最佳答案

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

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

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

var 可以自动以这种方式使用:
RUN echo ${http_proxy}

但是在您的情况下,您不需要使用它,仅设置代理变量就足以在构建期间使用。

这种技术也非常有用,可以避免在 Dockerfile 上写入密码。

希望能帮助到你

关于docker - 在代理后面的 vagrant 中使用 docker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43590454/

相关文章:

docker - 如何从 docker run 命令向主管传递环境变量

Docker 中的 PostgreSQL - pg_hba.conf 允许从主机访问容器

proxy - 配置Fiddler以使用公司网络的代理?

php - 查找通过代理连接的客户端的 IP 地址

java - 将字段添加到 Clojure 中的代理类

centos - 在 CentOS 6.5 上与 Chef Solo 一起 Vagrant : chef could not find recipe repoforge for cookbook yum?

shell - 第二次配置会重新运行脚本中的所有 shell 命令吗?

显然跳过了 Docker 内部生产的 Angular 构建

docker - 如何动态更改 docker 基础镜像

windows - 无法创建具有可访问网络接口(interface)的 VM