Docker构build“无法解决”archive.ubuntu.com“”apt-get无法安装任何东西
我一直在试图运行Docker构build以前工作的各种文件,现在不再工作。
只要Docker文件包含任何要安装软件的行,就会失败,并显示该包未find。
RUN apt-get -y install supervisor nodejs npm
日志中显示的常见信息是
Could not resolve 'archive.ubuntu.com'
任何想法,为什么任何软件不会安装?
取消注释/etc/default/docker
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
,因为Matt Carrierbuild议不适合我。 也没有把我的公司的DNS服务器在该文件。 但是,还有另一种方式(阅读)。
首先,我们来validation问题:
$ docker run busybox nslookup google.com # takes a long time nslookup: can't resolve 'google.com' # <--- appears after a long time Server: 8.8.8.8 Address 1: 8.8.8.8
如果该命令似乎挂起,但最终吐出错误“无法解决”google.com“”,那么你有同样的问题,我。
nslookup
命令查询DNS服务器8.8.8.8,将“google.com”的文本地址转换为IP地址。 具有讽刺意味的是,8.8.8.8是Google的公共DNS服务器 。 如果nslookup
失败, 像8.8.8.8这样的公共DNS服务器可能会被贵公司阻止 (我认为这是出于安全原因)。
你会认为把你公司的DNS服务器添加到/etc/default/docker
DOCKER_OPTS
中的DOCKER_OPTS
应该可以做到,但不pipe什么原因,它都不适合我。 我在下面描述了对我有用的东西。
scheme :
在主机上(我正在使用Ubuntu 16.04),找出主要和辅助DNS服务器地址:
$ nmcli dev show | grep 'IP4.DNS' IP4.DNS[1]: 10.0.0.2 IP4.DNS[2]: 10.0.0.3
使用这些地址,创build一个文件/etc/docker/daemon.json
:
$ sudo su root # cd /etc/docker # touch daemon.json
把它放在/etc/docker/daemon.json
:
{ "dns": ["10.0.0.2", "10.0.0.3"] }
从根目录退出:
# exit
现在重新启动docker:
$ sudo service docker restart
validation :
现在检查添加/etc/docker/daemon.json
文件是否允许您将“google.com”parsing为IP地址:
$ docker run busybox nslookup google.com Server: 10.0.0.2 Address 1: 10.0.0.2 Name: google.com Address 1: 2a00:1450:4009:811::200e lhr26s02-in-x200e.1e100.net Address 2: 216.58.198.174 lhr25s10-in-f14.1e100.net
参考文献 :
我根据Robin Winslow撰写的一篇文章解决scheme,得到了所有的荣誉。 谢谢,罗宾!
“修复Docker的networkingDNSconfiguration。” 罗宾·温斯洛。 检索2016-11-09。 https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/
经过很多头痛,我find了答案。 Could not resolve 'archive.ubuntu.com'
可以通过进行以下更改来解决:
-
在
/etc/default/docker
取消注释以下行
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
-
重新启动Docker服务
sudo service docker restart
-
删除caching了无效DNS设置的任何图像。
- 再次build设,问题应该得到解决。
信贷去安德鲁SB
我相信Matt Carrier的答案是解决这个问题的正确方法。 但是,在实施之后,我仍然观察到同样的行为: could not resolve 'archive.ubuntu.com'
。
这导致我最终发现,我连接到的networking阻止公共DNS。 解决这个问题的方法是将我的Docker容器configuration为使用与我的主机(运行Docker的机器)使用的服务器相同的名称服务器。
我如何分类:
- 由于我正在通过Docker文档,我已经在我的机器上安装了一个示例图像。 我能够启动一个新的容器来运行该映像,并在该容器中创build一个新的bash会话:
docker run -it docker/whalesay bash
- 容器是否有Internet连接?:
ping 172.217.4.238
(google.com) - 容器可以parsing主机名吗?
ping google.com
在我的情况下,第一个ping
导致了答复,第二个没有。
我如何修复:
一旦我发现DNS在容器内不工作,我证实我可以在主机上复制相同的行为。 nslookup google.com
在主机上解决得很好。 但是, nslookup google.com 8.8.8.8
或nsloookup google.com 8.8.4.4
超时。
接下来,我通过运行nm-tool
(在Ubuntu 14.04上)find了我的主机使用的名称服务器。 在快速反馈的基础上,我再次启动了示例映像,并将名称服务器的IP地址添加到容器的resolv.conf文件中: sudo vi /etc/resolv.conf
。 一旦保存,我再次尝试ping( ping google.com
),这一次它的工作!
请注意,对容器的resolv.conf所做的更改不是持久的,将在容器重新启动时丢失。 就我而言,更合适的解决scheme是将我的networking名称服务器的IP地址添加到主机的/etc/default/docker
文件中。
添加本地dns ip到默认的docker文件后,它开始为我工作…请find以下步骤…
$ nm-tool # (will give you the dns IP)
DNS:172.168.7.2
$ vim /etc/default/docker # (uncomment the DOCKER_OPTS and add DNS IP) DOCKER_OPTS="--dns 172.168.7.2 --dns 8.8.8.8 --dns 8.8.4.4" $ rm `docker ps --no-trunc -aq` # (remove all the containers to avoid DNS cache) $ docker rmi $(docker images -q) # (remove all the images) $ service docker restart #(restart the docker to pick up dns setting)
现在继续build设docker…… 🙂
我只是想为search引擎遇到这个问题的人添加一个迟到的回应。
不要这样做:我曾经在/ etc / default / docker中有一个选项来设置iptables=false
。 这是因为ufw没有工作(即使只有3个端口被允许,一切都被打开了),所以我盲目地回答了这个问题: 使用Docker时,不复杂的防火墙(UFW)不会阻塞任何东西,而这个注释
一般来说,我对iptables规则/ nat / routing的理解很低,所以为什么我可能做了一些非理性的事情。
事实certificate,我可能错误configuration了它,并杀死我的容器内的DNSparsing。 当我运行一个交互式的容器terminal时: docker run -i -t ubuntu:14.04 /bin/bash
我有这些结果:
root@6b0d832700db:/# ping google.com ping: unknown host google.com root@6b0d832700db:/# cat /etc/resolv.conf search online.net nameserver 8.8.8.8 nameserver 8.8.4.4 root@6b0d832700db:/# ping 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=1.76 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=1.72 ms
恢复所有ufwconfiguration(之前的规则),禁用ufw并从/ etc / default / docker中删除iptables = false恢复了容器的DNSparsingfunction。
现在我期待着按照这些说明重新启用ufwfunction。
对于也有这个问题的人,我通过编辑/etc/default/docker
文件解决了我的问题,正如其他答案和问题所build议的那样。 但是我不知道什么IP作为DNS使用。
只是过了一段时间,我发现我不得不在主机上运行ifconfig docker
来显示dockernetworking接口的IP地址。
docker0 Link encap:Ethernet Endereço de HW 02:42:69:ba:b4:07 inet end.: 172.17.0.1 Bcast:0.0.0.0 Masc:255.255.0.0 endereço inet6: fe80::42:69ff:feba:b407/64 Escopo:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1 pacotes RX:8433 erros:0 descartados:0 excesso:0 quadro:0 Pacotes TX:9876 erros:0 descartados:0 excesso:0 portadora:0 colisões:0 txqueuelen:0 RX bytes:484195 (484.1 KB) TX bytes:24564528 (24.5 MB)
我的情况是172.17.0.1
。 希望这有助于任何人也有这个问题。
在Googleing之后,我find了这个答案 。 我正在使用Windows,所以上面的一些答案不适用于我的文件系统。
基本上运行:
docker-machine ssh default echo "nameserver 8.8.8.8" > /etc/resolv.conf
这只是覆盖8.8.8.8
使用的现有域名服务器,我相信。 它为我工作!
我有同样的问题,并尝试提到的步骤,但似乎没有工作,直到刷新networking设置。
步骤:
- 如前所述,向
/etc/default/docker
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true"
添加DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true"
。 - 使用
iptables -t nat -F POSTROUTING
手动刷新PREROUTING表内容。 运行这个之后,重新启动docker,它会使用新的IP范围初始化nat表。
今天我得到了同样的问题,我只是在/ etc / default / docker中添加了一行
DOCKER_OPTS="--dns 172.18.20.13 --dns 172.20.100.29 --dns 8.8.8.8"
然后我重新启动了我的笔记本电脑。
在我的情况下重新启动docker守护进程是不够的,我必须重新启动我的笔记本电脑,使其工作。
对我来说同样的问题(在Ubuntu Xenial上)。
-
docker run --dns ...
容器工作。 - 更新docker
docker build
(docker-compose等)的docker守护进程选项不起作用。
在分析journalctl -u docker.service
日志( journalctl -u docker.service
)之后,如果发现了一些关于错误的resolvconf应用的警告。
之后,我发现我们的公司名称服务器被添加到networking接口,但不是在resolvconf中。
应用此解决scheme如何在接口中configuration我的静态DNS? (askubuntu) , 即将名称服务器添加到/etc/resolvconf/resolv.conf.d/tail
更新resolvconf(或重新启动)后。
bash docker run --rm busybox nslookup google.com
立即工作。
所有我的docker构build版本正在工作。