你如何在代理后面的dockerfile中运行`apt-get`?

Chr*_*den 68 apt http-proxy docker

我正在运行一个带有docker的虚拟机(Ubuntu 13.10)(版本0.8.1,构建a1598d1).我正在尝试使用dockerfile构建映像.首先,我想更新软件包(使用下面的代码 - 代理被混淆)但apt-get超时错误:Could not resolve 'archive.ubuntu.com'.

FROM ubuntu:13.10
ENV HTTP_PROXY <HTTP_PROXY>
ENV HTTPS_PROXY <HTTPS_PROXY>
RUN export http_proxy=$HTTP_PROXY
RUN export https_proxy=$HTTPS_PROXY
RUN apt-get update && apt-get upgrade
Run Code Online (Sandbox Code Playgroud)

我还在主机系统中运行以下命令:

sudo HTTP_PROXY=http://<PROXY_DETAILS>/ docker -d &
Run Code Online (Sandbox Code Playgroud)

主机能够apt-get毫无问题地运行.

如何更改dockerfile以允许它从容器内到达ubuntu服务器?

更新

我在CentOS中运行代码(更改FROM ubuntu:13.10FROM centos),它运行正常.这似乎是Ubuntu的一个问题.

Jir*_*iri 88

更新:

ENV中的环境变量大写错误.正确的是http_proxy.你的例子应该是:

FROM ubuntu:13.10
ENV http_proxy <HTTP_PROXY>
ENV https_proxy <HTTPS_PROXY>
RUN apt-get update && apt-get upgrade
Run Code Online (Sandbox Code Playgroud)

要么

FROM centos
ENV http_proxy <HTTP_PROXY>
ENV https_proxy <HTTPS_PROXY>
RUN yum update 
Run Code Online (Sandbox Code Playgroud)

ENV中指定的所有变量都预先附加到每个RUN命令.每个RUN命令都在自己的容器/环境中执行,因此它不会从以前的RUN命令继承变量!

注意:没有必要使用代理调用docker守护进程来实现此功能,但是如果您想要提取图像等,则还需要为docker deamon设置代理.您可以/etc/default/docker在Ubuntu中为守护进程设置代理(它不会影响容器设置).


此外,如果您在主机上运行代理(即localhost,127.0.0.1),也会发生这种情况.主机上的Localhost与容器中的localhost不同.在这种情况下,您需要使用另一个IP(如172.17.42.1)绑定您的代理,或者如果您绑定到0.0.0.0,您可以使用172.17.42.1而不是127.0.0.1来从容器连接docker build.

您还可以在此处查找示例:如何使用缓存快速重建dockerfile?

  • 对于Docker的当前状态,看起来你的Dockerfile中必须有`ENV http_proxy corporate-proxy.com`.这非常令人作呕,因为这意味着您无法与公司外的任何人共享您的Dockerfile.我刚刚通过在容器中运行polipo来验证这一点,同时尝试缓存`apt-get install`命令来开发Dockerfiles.也许未来版本的Docker会有一些神奇的iptables配置,允许透明代理HTTP请求? (3认同)

BMW*_*BMW 47

更新于02/10/2018

使用--configdocker 选项中的新功能,您无需再在Dockerfile中设置Proxy.您可以在企业环境中使用相同的Dockerfile.

--config string      Location of client config files (default "~/.docker")
Run Code Online (Sandbox Code Playgroud)

或环境变量 DOCKER_CONFIG

`DOCKER_CONFIG` The location of your client configuration files.

$ export DOCKER_CONFIG=~/.docker
Run Code Online (Sandbox Code Playgroud)

https://docs.docker.com/engine/reference/commandline/cli/

https://docs.docker.com/network/proxy/

我建议用httpProxy, httpsProxy, ftpProxy和设置代理noProxy.

{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://127.0.0.1:3001",
     "httpsProxy": "http://127.0.0.1:3001",
     "ftpProxy": "http://127.0.0.1:3001",
     "noProxy": "*.test.example.com,.example2.com"
   }
 }
}
Run Code Online (Sandbox Code Playgroud)

根据需要调整代理IP和端口并保存到 ftpProxy

使用它正确设置后,您可以正常运行docker build和docker run.

$ docker build -t demo . 

$ docker run -ti --rm demo env|grep -ri proxy
(standard input):http_proxy=http://127.0.0.1:3001
(standard input):HTTPS_PROXY=http://127.0.0.1:3001
(standard input):https_proxy=http://127.0.0.1:3001
(standard input):NO_PROXY=*.test.example.com,.example2.com
(standard input):no_proxy=*.test.example.com,.example2.com
(standard input):FTP_PROXY=http://127.0.0.1:3001
(standard input):ftp_proxy=http://127.0.0.1:3001
(standard input):HTTP_PROXY=http://127.0.0.1:3001
Run Code Online (Sandbox Code Playgroud)

老答案

Dockerfile中的以下设置适合我.我测试过~/.docker/config.json,CoreOSVagrant.假设代理端口是boot2docker

在Centos:

ENV http_proxy=ip:3128 
ENV https_proxy=ip:3128
Run Code Online (Sandbox Code Playgroud)

在Ubuntu中:

ENV http_proxy 'http://ip:3128'
ENV https_proxy 'http://ip:3128'
Run Code Online (Sandbox Code Playgroud)

注意格式,有些有http,有些没有,有些有单配额.如果IP地址是192.168.0.193,则设置为:

在Centos:

ENV http_proxy=192.168.0.193:3128 
ENV https_proxy=192.168.0.193:3128
Run Code Online (Sandbox Code Playgroud)

在Ubuntu中:

ENV http_proxy 'http://192.168.0.193:3128'
ENV https_proxy 'http://192.168.0.193:3128'
Run Code Online (Sandbox Code Playgroud)

如果您需要在coreos中设置代理,例如拉动图像

cat /etc/systemd/system/docker.service.d/http-proxy.conf

[Service]
Environment="HTTP_PROXY=http://192.168.0.193:3128"
Run Code Online (Sandbox Code Playgroud)

  • $ DOCKER_CONFIG应该指向目录而不是直接指向config.json文件 (2认同)

zha*_*nxw 37

如果--build-arg要使用Dockerfile构建,可以使用该选项.

https://github.com/docker/docker/issues/14634上的链接,请参阅"使用多个HTTP_PROXY构建--build-arg"部分:

[root@pppdc9prda2y java]# docker build 
  --build-arg https_proxy=$HTTP_PROXY --build-arg http_proxy=$HTTP_PROXY 
  --build-arg HTTP_PROXY=$HTTP_PROXY --build-arg HTTPS_PROXY=$HTTP_PROXY 
  --build-arg NO_PROXY=$NO_PROXY  --build-arg no_proxy=$NO_PROXY -t java .
Run Code Online (Sandbox Code Playgroud)

注意:在您自己的系统上,请确保已设置HTTP_PROXY和NO_PROXY环境变量.

  • 讨厌的解决方法?在某些(大多数)情况下,如果您的图像(例如)被公司其他部门的人员使用,可能是在不同的代理后面,则最好不要将自己的代理程序添加到图像中. (16认同)

Rez*_*shi 11

在您的Dockerfile中的任何apt-get命令之前,您应该放置此行

COPY apt.conf /etc/apt/apt.conf
Run Code Online (Sandbox Code Playgroud)

Dont'f忘记创建apt.conf在你有相同的文件夹Dockerfile的内容apt.conf文件应该是这样的:

Acquire::socks::proxy "socks://YOUR-PROXY-IP:PORT/";
Acquire::http::proxy "http://YOUR-PROXY-IP:PORT/";
Acquire::https::proxy "http://YOUR-PROXY-IP:PORT/";
Run Code Online (Sandbox Code Playgroud)

如果您使用用户名和密码连接到您的代理,那么apt.conf应如下所示:

Acquire::socks::proxy "socks://USERNAME:PASSWORD@YOUR-PROXY-IP:PORT/";
Acquire::http::proxy "http://USERNAME:PASSWORD@YOUR-PROXY-IP:PORT/";
Acquire::https::proxy "http://USERNAME:PASSWORD@YOUR-PROXY-IP:PORT/";
Run Code Online (Sandbox Code Playgroud)

例如 :

Acquire::https::proxy "http://foo:bar@127.0.0.1:8080/";
Run Code Online (Sandbox Code Playgroud)

其中foo是用户名,bar是密码.


Gae*_*tan 7

在小写环境变量中使用--build-arg:

docker build --build-arg http_proxy=http://proxy:port/ --build-arg https_proxy=http://proxy:port/ --build-arg ftp_proxy=http://proxy:port --build-arg no_proxy=localhost,127.0.0.1,company.com -q=false .
Run Code Online (Sandbox Code Playgroud)


Con*_*ard 6

@Reza Farshi 提供的答案(在我的情况下效果更好)的一个小替代方案是将代理设置写出以通过 Dockerfile/etc/apt/apt.conf使用,例如:echo

FROM ubuntu:16.04

RUN echo "Acquire::http::proxy \"$HTTP_PROXY\";\nAcquire::https::proxy \"$HTTPS_PROXY\";" > /etc/apt/apt.conf

# Test that we can now retrieve packages via 'apt-get'
RUN apt-get update
Run Code Online (Sandbox Code Playgroud)

这种方法的优点是可以在映像构建时动态传入代理地址,而不必从主机复制设置文件。

例如

docker build --build-arg HTTP_PROXY=http://<host>:<port> --build-arg HTTPS_PROXY=http://<host>:<port> .

根据docker 构建文档。


use*_*495 5

正如其他答案所建议的那样,--build-arg可能是解决方案。就我而言,--network=host除了--build-arg选项之外,我还必须添加。

docker build -t <TARGET> --build-arg http_proxy=http://<IP:PORT> --build-arg https_proxy=http://<IP:PORT> --network=host .
Run Code Online (Sandbox Code Playgroud)