问题:任何使用依赖于 centos、ubuntu 或 debian 的 Dockerfile 的构建都无法构建。
环境:我有一个 Mac OS X,运行 VMWare 和一个 guest Ubuntu 14.04,运行 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 运行容器,但这是在构建期间。
CENTOS
来自 centos 运行 yum install a b c
UBUNTU
来自 ubuntu 运行 apt-get install a b c
用户反射(reflect)可能是 DNS 配置有问题,其他配置已将 Google 的 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 上的大多数用户都提到这可能是 DNS 配置的问题......所以这是我的 Ubuntu:
$ sudo cat /etc/resolv.conf
nameserver 127.0.1.1
search localdomain
我尝试改变它,同样的问题......
最佳答案
问题
在#docker@freenode 与一些开发人员交谈时,每个人都清楚问题所在:DNS 和环境。该构建在家里的常规 Internet 连接上运行良好。
解决方案:
此问题发生在具有私有(private) DNS 服务器的环境中,或者网络阻止了 Google 的 DNS 服务器。即使 docker 容器可以 ping 8.8.8.8,构建仍然需要访问防火墙或数据中心后面的同一个私有(private) DNS 服务器。
使用 --dns 开关启动 Docker 守护程序以指向您的私有(private) DNS 服务器,就像配置您的主机操作系统一样。这是通过反复试验发现的。
详情
我的 MAC OS X 主机操作系统在我的/etc/resolv.conf 上配置了不同的 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
我的主机可能在构建时将数据包丢弃到 Google 的 IP 地址 8.8.8.8...我只是将这 2 个 IP 地址放在 Ubuntu 的 docker daemon 配置下:
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"
...
构建现在按预期工作!
$ 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 channel 中提供帮助的人!
永久虚拟机解决方案 - 2015 年 7 月 2 日更新
我们现在混合使用了 GitHub Enterprise 和 CoreOS Enterprise Docker Registry……因此,从 HOST 机器添加公司 DNS 服务器以使 VM 也能正常工作对我来说很重要。
用主机的/etc/resolv.conf 替换 guest 操作系统的/etc/resolv.conf 也解决了这个问题! docker 1.7.0。我刚刚在 VMWare Fusion 上使用 Ubuntu 15.04 创建了一个新 VM,但我又遇到了这个问题...
/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 之后*
~/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
关于dns - Dockerfile : Docker build can't download packages: centos->yum, debian/ubuntu->apt-get 在内网后面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25130536/