首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在代理后面的dockerfile中运行``apt get`?

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

Stack Overflow用户
提问于 2014-03-05 01:50:45
回答 12查看 120.2K关注 0票数 81

我正在运行一个带有docker (版本0.8.1,构建a1598d1)的虚拟机(Ubuntu13.10)。我正在尝试构建一个带有dockerfile的镜像。首先,我想要更新包(使用下面的代码-代理是模糊的),但apt-get超时并显示错误:Could not resolve 'archive.ubuntu.com'

代码语言:javascript
复制
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

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

代码语言:javascript
复制
sudo HTTP_PROXY=http://<PROXY_DETAILS>/ docker -d &

主机能够正常运行apt-get

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

更新

我在CentOS中运行代码(将FROM ubuntu:13.10更改为FROM centos),它工作得很好。这似乎是Ubuntu的一个问题。

EN

回答 12

Stack Overflow用户

发布于 2014-03-05 06:33:54

更新

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

代码语言:javascript
复制
FROM ubuntu:13.10
ENV http_proxy <HTTP_PROXY>
ENV https_proxy <HTTPS_PROXY>
RUN apt-get update && apt-get upgrade

代码语言:javascript
复制
FROM centos
ENV http_proxy <HTTP_PROXY>
ENV https_proxy <HTTPS_PROXY>
RUN yum update 

ENV中指定的所有变量都放在每个运行命令的前面。每个RUN命令都是在自己的容器/环境中执行的,所以它不会从以前的RUN命令中继承变量!

注意:没有必要使用代理来调用docker守护进程,尽管如果你想拉取图像等,你也需要为docker守护进程设置代理。您可以在Ubuntu中为/etc/default/docker中的守护进程设置代理(不影响容器设置)。

此外,如果您在主机(即本地主机,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过程中从容器连接。

您还可以在此处查找示例:How to rebuild dockerfile quick by using cache?

票数 103
EN

Stack Overflow用户

发布于 2015-05-15 14:26:03

更新于2018年2月10日

有了docker选项--config中的新功能,您不再需要在Dockerfile中设置代理。在有或没有代理设置的情况下,您都可以在公司环境中和外部环境中使用相同的Dockerfile。

命令docker run选项:

代码语言:javascript
复制
--config string      Location of client config files (default "~/.docker")

或环境变量DOCKER_CONFIG

代码语言:javascript
复制
`DOCKER_CONFIG` The location of your client configuration files.

$ export DOCKER_CONFIG=~/.docker

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

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

我建议用httpProxy, httpsProxy, ftpProxynoProxy来设置代理(官方文档遗漏了变量ftpProxy,这个变量有时很有用)

代码语言:javascript
复制
{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://192.168.1.12:3128",
     "httpsProxy": "http://192.168.1.12:3128",
     "ftpProxy": "http://192.168.1.12:3128",
     "noProxy": "*.test.example.com,.example2.com,127.0.0.0/8"
   }
 }
}

为您的代理环境调整代理IP和端口并保存到~/.docker/config.json

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

代码语言:javascript
复制
$ cat Dockerfile

FROM alpine

$ docker build -t demo . 
    
$ docker run -ti --rm demo env|grep -ri proxy
(standard input):HTTP_PROXY=http://192.168.1.12:3128
(standard input):http_proxy=http://192.168.1.12:3128
(standard input):HTTPS_PROXY=http://192.168.1.12:3128
(standard input):https_proxy=http://192.168.1.12:3128
(standard input):NO_PROXY=*.test.example.com,.example2.com,127.0.0.0/8
(standard input):no_proxy=*.test.example.com,.example2.com,127.0.0.0/8
(standard input):FTP_PROXY=http://192.168.1.12:3128
(standard input):ftp_proxy=http://192.168.1.12:3128

旧答案(已停用)

Dockerfile中的以下设置对我有效。我在CoreOSVagrantboot2docker上进行了测试。假设代理端口为3128

###In Centos:

代码语言:javascript
复制
ENV http_proxy=ip:3128 
ENV https_proxy=ip:3128

###In Ubuntu: ENV http_proxy 'http://ip:3128‘ENV https_proxy 'http://ip:3128

注意格式,有些有http,有些没有,有些只有一个配额。如果IP地址为192.168.0.193,则设置为:

###In Centos:

代码语言:javascript
复制
ENV http_proxy=192.168.0.193:3128 
ENV https_proxy=192.168.0.193:3128

###In Ubuntu: ENV http_proxy 'http://192.168.0.193:3128‘ENV https_proxy 'http://192.168.0.193:3128

###If您需要在coreos中设置代理,例如拉取镜像

代码语言:javascript
复制
cat /etc/systemd/system/docker.service.d/http-proxy.conf

[Service]
Environment="HTTP_PROXY=http://192.168.0.193:3128"
票数 55
EN

Stack Overflow用户

发布于 2016-02-26 05:41:21

当您想要使用Dockerfile文件进行构建时,可以使用--build-arg选项。

通过https://github.com/docker/docker/issues/14634上的链接,请参阅“使用--build-arg和多个HTTP_PROXY进行构建”一节:

代码语言:javascript
复制
[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 .

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

票数 44
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22179301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档