Docker构建“无法解析'archive.ubuntu.com'”apt-get无法安装任何东西
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker构建“无法解析'archive.ubuntu.com'”apt-get无法安装任何东西相关的知识,希望对你有一定的参考价值。
我一直在尝试在之前使用过的各种文件上运行Docker构建,现在这些文件已经不再有效了。
一旦Docker文件包含任何要安装软件的行,它就会失败并显示一条消息,说明找不到该软件包。
RUN apt-get -y install supervisor nodejs npm
日志中出现的常见消息是
Could not resolve 'archive.ubuntu.com'
知道为什么任何软件都不会安装?
在DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
中取消注释/etc/default/docker
,因为Matt Carrier建议不适合我。也没有将我公司的DNS服务器放在该文件中。但是,还有另一种方式(继续阅读)。
首先,让我们验证问题:
$ docker run --rm 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's public DNS server。如果nslookup
失败,贵公司可能会阻止像8.8.8.8这样的公共DNS服务器(我假设是出于安全原因)。
您认为将公司的DNS服务器添加到DOCKER_OPTS
的/etc/default/docker
应该可以解决问题,但无论出于何种原因,它都不适用于我。我在下面描述一下对我有用的东西。
解:
在主机上(我使用的是Ubuntu 16.04),找出主DNS服务器地址和辅助DNS服务器地址:
$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]: 10.0.0.2
IP4.DNS[2]: 10.0.0.3
使用这些地址,创建一个文件/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"]
}
从root退出:
# exit
现在重启docker:
$ sudo service docker restart
验证:
现在检查添加/etc/docker/daemon.json
文件是否允许您将“google.com”解析为IP地址:
$ docker run --rm 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
参考文献:
我的解决方案基于罗宾温斯洛的一篇文章,他应该得到解决方案的所有功劳。谢谢,罗宾!
“修复Docker的网络DNS配置。”罗宾温斯洛。检索2016-11-09。 https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/
同样的问题(在Ubuntu Xenial上)。
docker run --dns ...
用于容器工作。- 更新
docker build
(docker-compose等)的docker守护程序选项不起作用。
在分析了docker日志(journalctl -u docker.service
)之后,如果发现了一些关于应用了错误的resolvconf的警告。
之后我发现我们的公司名称服务器已添加到网络接口,但未添加到resolvconf中。
应用此解决方案How do I configure my static DNS in interfaces? (askubuntu),即添加名称服务器到/etc/resolvconf/resolv.conf.d/tail
更新resolvconf(或重启)后。
bash
docker run --rm busybox nslookup google.com
立即工作。
我所有的docker-compose构建现在都在运行。
我今天遇到了同样的问题,我刚刚在/ etc / default / docker中添加了以下行
DOCKER_OPTS="--dns 172.18.20.13 --dns 172.20.100.29 --dns 8.8.8.8"
然后我重新启动了我的笔记本电脑。
在我的情况下,重启docker守护程序对我来说还不够,我必须重新启动我的笔记本电脑才能使它工作。
在花费太多时间在任何其他解决方案之前,只需重新启动Docker并再试一次。
在Windows 10上使用Docker Desktop for Windows解决了我的问题。
经过很多头痛我找到了答案。 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
- 删除已缓存无效DNS设置的所有图像。
- 再次构建,问题应该解决。
归功于Andrew SB
我遇到了同样的问题,但是neet取消注释/ etc / default / docker dns条目,也没有编译构建容器中的/etc/resolv.conf或/etc/docker/daemon.json对我有帮助。
但是在使用选项--network = host构建之后,解析再次正常。
docker build --network=host -t my-own-ubuntu-like-image .
也许这会再帮助一个人。
我相信Matt Carrier's answer是解决这个问题的正确方法。然而,在实现它之后,我仍然观察到相同的行为:could not resolve 'archive.ubuntu.com'
。
这导致我最终发现我连接的网络阻止了公共DNS。解决此问题的方法是将我的Docker容器配置为使用与我的主机(运行Docker的机器)所使用的名称服务器相同的名称服务器。
我如何分类:
- 由于我正在使用Docker文档,我已经在我的机器上安装了示例图像。我能够启动一个新容器来运行该映像并在该容器中创建一个新的bash会话:
docker run -it docker/whalesay bash
- 容器是否有Internet连接?:
ping 172.217.4.238
(google.com) - 容器可以解析主机名吗?
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上)找到了我的主机正在使用的名称服务器。在快速反馈的过程中,我再次启动了示例图像,并将名称服务器的IP地址添加到容器的resolv.conf文件中:sudo vi /etc/resolv.conf
。一旦保存,我再次尝试ping(ping google.com
),这次它有效!
请注意,对容器的resolv.conf所做的更改不会持久,并且会在容器重新启动时丢失。在我的情况下,更合适的解决方案是将我的网络名称服务器的IP地址添加到主机的/etc/default/docker
文件中。
将本地dns ip添加到默认的docker文件后,它开始为我工作...请找到以下步骤...
$ 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)
现在继续建造码头工人...... :)
对于那些也遇到这个问题的人,我通过编辑/etc/default/docker
文件来解决我的问题,正如其他答案和问题所建议的那样。但是我不知道用什么IP作为DNS。
只是过了一段时间,我发现我必须在主机上运行ifconfig docker
才能显示docker网络接口的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
。希望这可以帮助任何有这个问题的人。
我只想为从搜索引擎遇到这个问题的任何人添加一个迟到的回复。
不要这样做:我曾经在/ etc / default / docker中有一个选项来设置iptables=false
。这是因为ufw不起作用(即使只允许3个端口,一切都已打开)所以我盲目地按照这个问题的答案:Uncomplicated Firewall (UFW) is not blocking anything when using Docker和this, which was linked in the comments
我对iptables规则/ nat /路由的理解非常低,因此我可能做了一些非理性的事情。
事实证明我可能错误配置它并杀死我的容器内的DNS解析。当我运行一个交互式集装箱码头时: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
恢复我的所有ufw配置(befor
以上是关于Docker构建“无法解析'archive.ubuntu.com'”apt-get无法安装任何东西的主要内容,如果未能解决你的问题,请参考以下文章
使用新版Golang1.18多段构建制作docker镜像的踩坑经历
企业运维实战--最全Docker学习笔记1.Docker简介安装部署镜像构建Dockerfile详解镜像构建镜像优化本地私有仓库搭建