Dockerfile: Docker build 无法下载包: centos->yum, debian/ubuntu->apt-get 内网后面

Posted

技术标签:

【中文标题】Dockerfile: Docker build 无法下载包: centos->yum, debian/ubuntu->apt-get 内网后面【英文标题】:Dockerfile: Docker build can't download packages: centos->yum, debian/ubuntu->apt-get behind intranet 【发布时间】:2014-09-27 15:02:21 【问题描述】:

问题:任何使用依赖于 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

行为:使用“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

用户反映可能是 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

我尝试改变它,同样的问题......

【问题讨论】:

【参考方案1】:

创建一个本地 repo 镜像 - 这也可以作为 docker-mirror-packages-repo 完成

然后运行"docker build --add-host "archive.ubuntu.com:repo-docker-ip" 以从本地镜像下载构建过程。这不仅速度更快,而且可以确保您的构建具有更好的可重复性。

我将它用于docker-systemctl-replacement 的测试套件,它正在测试与多个发行版的兼容性,每个发行版都有数十个 docker 重建。

【讨论】:

【参考方案2】:

就我而言,问题在于我们公司的 DNS 在某些方面存在缺陷,这需要篡改 /etc/hosts,而对于 docker,则需要篡改 /etc/docker/daemon.json。那是隐藏错误的文件:


    "dns": ["10.5...", "10.5...", "10.5..."]

我已备份并替换为


    "dns": ["8.8.8.8", "8.8.4.4"]

它开始工作了。我正在寻找一种适用于所有情况的解决方案 - 在我们的 *** 上需要自定义 DNS 服务器以及正常网络上的家庭。

请注意,在现代 Linux 中,会生成 /etc/hosts,并且 DNS 由 SystemD 管理。我不确定 Docker 是如何处理这个问题的,但也许将其指向 SystemD 在127.0.0.53 的假 DNS 就足够了。

【讨论】:

【参考方案3】:

对我来说,问题是我的 ISP 阻止了 docker 用作后备默认设置的 google 的 DNS (8.8.8.8)。

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

在我的情况下(运行 Ubuntu 17.04),尝试从 /etc/resolv.conf 获取此信息不起作用,但我使用了以下命令:

nmcli dev show | grep IP4.DNS

然后我把这个IP加在/etc/defaults/docker

DOCKER_OPTS="--dns 192.168.50.1"

现在重新启动您的 docker 守护程序,然后再次尝试构建。

【讨论】:

【参考方案4】:

问题

在#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

我的主机可能在构建时将数据包丢弃到 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 频道中提供帮助的人!

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

我们现在混合使用了 GitHub Enterprise 和 CoreOS Enterprise Docker Registry……因此,从 HOST 机器添加公司 DNS 服务器以使 VM 也能正常工作对我来说很重要。

用主机的 /etc/resolv.conf 替换来宾操作系统的 /etc/resolv.conf 也解决了这个问题!码头工人 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

【讨论】:

在 Ubuntu 14.04 上,systemd 的文件是 /lib/systemd/system/docker.service 将同一行添加到 EXEC 指令中。 DOCKER_OPTS 位置的相关答案在***.com/a/30505018/433814 我发现的另一个解决方案是在 VM 中使用相同的 HOST 的 /etc/resolv.conf ... resolve.conf 指向我的环回 127.0.01。将其更改为 google DNS 名称服务器 8.8.8.8 使其工作。谢谢! 我还必须删除私有 DNS,如 (askubuntu.com/questions/627899/...) BONUS oneliner: DOCKER_OPTS=$(cat /etc/resolv.conf | grep nameserver | awk ' printf " --dns " $2 ') && sudo service docker restart【参考方案5】:

此外,只需将主机(在我的情况下为 mac osx)中的名称服务器添加到 docker-machine vm 即可解决问题。

【讨论】:

【参考方案6】:

我也遇到了同样的问题。提供的解决方案对我来说没有帮助。但只要我更新了我的 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>

【讨论】:

【参考方案7】:

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

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

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

【讨论】:

这对我不起作用 :( 在 Intranet 后面,唯一的解决方案是在守护进程配置中添加 DNS 服务器。

以上是关于Dockerfile: Docker build 无法下载包: centos->yum, debian/ubuntu->apt-get 内网后面的主要内容,如果未能解决你的问题,请参考以下文章

使用dockerfile文件创建镜像时docker build没有反应

Docker Dockerfile详解

docker build 命令

[Docker] 使用 Dockerfile 的多级构建 (multi-stage builds)

如何理解docker镜像build中的上下文

docker-maven-plugin 完全免Dockerfile 文件