Dockerfile:Docker构建无法下载软件包:centos-> yum,debian/ubuntu-> apt-get in intranet

Mar*_*les 33 dns centos docker linux-containers

问题:任何构建,具有依赖于centos,ubuntu或debian的Dockerfile都无法构建.

环境:我有一台Mac OS X,运行VMWare,客户端为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
Run Code Online (Sandbox Code Playgroud)

行为:使用"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 RUN yum安装abc

  • UBUNTU

    从ubuntu RUN apt-get install abc

用户已经报告可能是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
Run Code Online (Sandbox Code Playgroud)

问题仍然存在......所以,#docker @Freenode上的大多数用户提到它可能是DNS配置的问题......所以这是我的Ubuntu:

$ sudo cat /etc/resolv.conf 
nameserver 127.0.1.1
search localdomain
Run Code Online (Sandbox Code Playgroud)

我试过改变那个,同样的问题......

Mar*_*les 42

问题

与#docker @ freenode的一些开发人员交谈时,每个人都清楚这个问题:DNS和环境.该版本在家中的常规Internet连接上运行良好.

解:

在具有专用DNS服务器的环境中,或网络阻止Google的DNS服务器时,会出现此问题.即使docker容器可以ping 8.8.8.8,构建仍然需要访问防火墙或数据中心后面的同一个私有DNS服务器.

使用--dns开关启动Docker守护程序以指向您的私有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
Run Code Online (Sandbox Code Playgroud)

我的主机可能会在建立时将数据包丢弃到Google的IP地址8.8.8.8 ...我只是将这两个IP地址放在Ubuntu的docker守护程序配置下:

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"
...
Run Code Online (Sandbox Code Playgroud)

构建现在按预期工作!

$ 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
Run Code Online (Sandbox Code Playgroud)

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

永久虚拟机解决方案 - 2015年7月2日更新

我们现在混合使用GitHub Enterprise和CoreOS Enterprise Docker Registry ...因此,从HOST机器添加企业DNS服务器对我来说非常重要,这样才能使VM运行起来.

使用主机的/etc/resolv.conf替换来宾操作系统中的/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
Run Code Online (Sandbox Code Playgroud)

/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
Run Code Online (Sandbox Code Playgroud)

  • 在Ubuntu 14.04上,systemd的文件为/lib/systemd/system/docker.service。在EXEC指令中添加同一行。 (2认同)

小智 8

我有同样的问题.提供的解决方案在我的案例中没有帮助.但是我很快就更新了我的Dockerfile,为其中的代理添加了环境变量.

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>
Run Code Online (Sandbox Code Playgroud)


小智 5

这可能是由于您的本地缓存名称服务器侦听127.0.1.1,无法从容器内访问.

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

CMD "sh" "-c" "echo nameserver 8.8.8.8 > /etc/resolv.conf"
Run Code Online (Sandbox Code Playgroud)