Dockerfile:Docker build不能下载软件包:centos-> yum,debian / ubuntu-> apt-get后面的内网

问题:任何构build,与一个Dockerfile取决于Centos,Ubuntu或Debian无法build立。

环境:我有一个Mac OS X,运行一个客户端Ubuntu 14.04的VMWare,运行Docker:

mdesales@ubuntu ~ $ sudo docker version Client version: 1.1.2 Client API version: 1.13 Go version (client): go1.2.1 Git commit (client): d84a070 Server version: 1.1.2 Server API version: 1.13 Go version (server): go1.2.1 Git commit (server): d84a070 

行为:使用“docker build”无法下载软件包。 这里有一个这样的Dockerfile的例子: https ://github.com/Krijger/docker-cookbooks/blob/master/jdk8-oracle/Dockerfile,https: //github.com/ottenhoff/centos-java/blob/master/Dockerfile

我知道我们可以用–dns运行一个容器,但是这是在构build时间。

  • CENTOS

    FROM centos RUN yum安装abc

  • UBUNTU

    从Ubuntu的运行apt-get安装abc

用户已经报告说,这可能是DNSconfiguration的问题,其他的和configuration有谷歌的DNS服务器注释掉。

 Step 2 : RUN yum install -y curl; yum upgrade -y; yum update -y; yum clean all ---> Running in 5f11b65c87b8 Loaded plugins: fastestmirror Couldn't resolve host 'mirrorlist.centos.org 

仍然问题依然存在…因此,#docker @ Freenode上的大多数用户提到,这可能是DNSconfiguration的问题…所以这里是我的Ubuntu:

 $ sudo cat /etc/resolv.conf nameserver 127.0.1.1 search localdomain 

我试图改变,同样的问题…

问题

与#docker @ freenode的一些开发者交谈,这个问题对每个人都是清楚的:DNS和环境。 这种构build在家里的普通互联网连接上工作得很好。

解:

在具有专用DNS服务器的环境中,或者networking阻止Google的DNS服务器时,会发生此问题。 即使Docker容器可以ping通8.8.8.8,构build仍然需要访问防火墙或数据中心后面的相同专用DNS服务器。

使用–dns开关启动Docker守护程序,以指向您的专用DNS服务器,就像您的主机操作系统configuration一样。 这是通过反复试验find的。

细节

我的MAC OS X主机操作系统在我的/etc/resolv.conf中configuration了不同的DNS:

 mdesales@Marcello-Work ~ (mac) $ cat /etc/resolv.conf search corp.my-private-company.net nameserver 172.18.20.13 nameserver 172.20.100.29 

我的主机可能会丢弃数据包到谷歌的IP地址8.8.8.8,同时build立…我只是把这两个IP地址,并放在Ubuntu的docker守护进程configuration:

 mdesales@ubuntu ~ $ cat /etc/default/docker ... ... # Use DOCKER_OPTS to modify the daemon startup options. DOCKER_OPTS="--dns 172.18.20.13 --dns 172.20.100.29 --dns 8.8.8.8" ... 

构build现在按预期工作!

 $ sudo ./build.sh Sending build context to Docker daemon 7.168 kB Sending build context to Docker daemon Step 0 : FROM centos ---> b157b77b1a65 Step 1 : MAINTAINER Marcello_deSales@intuit.com ---> Running in 49bc6e233e4c ---> 2a380810ffda Removing intermediate container 49bc6e233e4c Step 2 : RUN yum install -y curl; yum upgrade -y; yum update -y; yum clean all ---> Running in 5f11b65c87b8 Loaded plugins: fastestmirror Determining fastest mirrors * base: mirror.supremebytes.com * extras: centos.mirror.ndchost.com * updates: mirrors.tummy.com Resolving Dependencies --> Running transaction check ---> Package systemd.x86_64 0:208-11.el7 will be updated ---> Package systemd.x86_64 0:208-11.el7_0.2 will be an update ---> Package systemd-libs.x86_64 0:208-11.el7 will be updated ---> Package systemd-libs.x86_64 0:208-11.el7_0.2 will be an update --> Finished Dependency Resolution 

感谢@BrianF和其他帮助IRC频道的人!

永久虚拟机解决scheme – 更新2015年7月2日

我们现在有了GitHub Enterprise和CoreOS Enterprise Docker Registry …所以,为了使虚拟机也能正常工作,从主机添加公司的DNS服务器是非常重要的。

用主机的/etc/resolv.confreplaceguest OS中的/etc/resolv.conf也解决了这个问题! Docker 1.7.0。 我刚刚在VMWare Fusion上使用Ubuntu 15.04创build了一个新的虚拟机,我再次遇到了这个问题。

在/etc/resolv.conf之前

 ~/dev/github/public/stackedit on ⭠ master ⌚ 20:31:02 $ cat /etc/resolv.conf # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN nameserver 127.0.1.1 search localdomain 

/etc/resolv.conf AFTER *

 ~/dev/github/public/stackedit on ⭠ master ⌚ 20:56:09 $ cat /etc/resolv.conf # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN search corp.mycompany.net nameserver 10.180.194.35 nameserver 10.180.194.36 nameserver 192.168.1.1 

我有相同的问题。 提供的解决scheme并没有帮助我的情况。 但它很快就更新我的Dockerfile添加其中的代理环境variables。

 ENV HTTP_PROXY http://<proxy_host>:<port> ENV HTTPS_PROXY http://<proxy_host>:<port> ENV http_proxy http://<proxy_host>:<port> ENV https_proxy http://<proxy_host>:<port> 

这可能是由于您的本地caching名称服务器在127.0.1.1上侦听,而这在容器内无法访问。

尝试将以下内容放入您的Dockerfile

 CMD "sh" "-c" "echo nameserver 8.8.8.8 > /etc/resolv.conf" 

另外,只需从主机(在我的情况下是mac osx)添加名称服务器到docker-machine虚拟机解决了这个问题。

对我来说,问题是我的ISP阻止了谷歌的DNS(8.8.8.8),docker使用它作为后备默认值。

这里的诀窍是找出你的DNS IP并告诉docker使用它。

在我的情况下(运行Ubuntu 17.04),试图从/etc/resolv.conf获取这个信息是行不通的,但是我使用了这个命令:

 nmcli dev show | grep IP4.DNS 

然后我把这个IPjoin到/etc/defaults/docker

 DOCKER_OPTS="--dns 192.168.50.1" 

现在重新启动你的d​​ocker守护进程,然后再试一次。