Docker构建“无法解析'archive.ubuntu.com'”apt-get无法安装任何东西
Posted
技术标签:
【中文标题】Docker构建“无法解析\'archive.ubuntu.com\'”apt-get无法安装任何东西【英文标题】:Docker build "Could not resolve 'archive.ubuntu.com'" apt-get fails to install anythingDocker构建“无法解析'archive.ubuntu.com'”apt-get无法安装任何东西 【发布时间】:2014-09-19 09:33:21 【问题描述】:我一直在尝试在以前工作的各种文件上运行 Docker 构建,现在这些文件不再工作了。
只要 Docker 文件包含任何要安装软件的行,它就会失败并显示一条消息,指出找不到软件包。
RUN apt-get -y install supervisor nodejs npm
日志中出现的常见消息是
Could not resolve 'archive.ubuntu.com'
知道为什么任何软件都无法安装吗?
【问题讨论】:
当机器与网络断开连接时会发生这种情况......我已经看到如果我只发出newgrp docker
而不是完全注销然后登录,那么这种情况会发生在具有新 docker install 的 linux 笔记本电脑上在给自己sudo usermod -aG docker myuserid
之后……它肯定是一个边缘情况,但它确实发生了
【参考方案1】:
按照Matt Carrier 的建议在/etc/default/docker
中取消注释DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
对我有用不。也没有将我公司的 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 服务器添加到 /etc/default/docker
中的 DOCKER_OPTS
应该可以解决问题,但无论出于何种原因,它都对我不起作用。我在下面描述了对我有用的方法。
解决方案:
在主机上(我使用的是 Ubuntu 16.04),找出主要和次要 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"]
从根目录退出:
# 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
参考文献:
我的解决方案基于 Robin Winslow 的一篇文章,他的解决方案值得称赞。谢谢,罗宾!
“修复 Docker 的网络 DNS 配置。”罗宾温斯洛。检索 2016-11-09。 https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/
【讨论】:
我收到一个错误,更改后无法启动服务。这是因为我修改了 /etc/default/docker 和 /etc/init.d/docker 中的 DOCKER_OPTS。还原更改解决了 docker 服务的启动问题 这对我有用(在公司网络上),而接受的解决方案却没有。 这对我也有效,而接受的解决方案却没有。我使用 nslookup 来获取我的 DNS 服务器 IP,但不是 nmcli。 daemon.json 也适用于我!您可以通过此命令检查您的公司是否已阻止 8.8.8.8nslookup google.com 8.8.8.8
在我的情况下,我收到此错误 connection timed out; no servers could be reached
我认为/etc/default/docker
对某些人不起作用的原因是(引用文件中的评论)# THIS FILE DOES NOT APPLY TO SYSTEMD
【参考方案2】:
经过一番头疼后,我找到了答案。 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
【讨论】:
如果您不想执行上述 #3,也可以添加 --no-cache=true 这对我不起作用,我不知道为什么。我已经断断续续地与这个斗争了好几个星期了。 我在 linux mint 上运行,所以没有 boot2docker。 /etc/default/docker 已创建并具有上面的 DOCKER_OPTS 标志。我重新启动了服务,清除了所有图像和容器,但仍然没有。 @CoreyOgburn 我也会尝试 jschorr 上面提到的 --no-cache=true。例如:docker build --no-cache=true ...
我跑了docker build --no-cache=true -t docker-whale .
,但似乎没有发生任何不同。【参考方案3】:
我遇到了同样的问题,但是既不取消注释 /etc/default/docker dns 条目,也不编辑构建容器中的 /etc/resolv.conf 或/etc/docker/daemon.json 对我有帮助。
但是在我使用选项 --network=host 构建之后,解析又好了。
docker build --network=host -t my-own-ubuntu-like-image .
也许这会再次帮助某人。
【讨论】:
我已经收到一个不同的错误很长一段时间“无法连接到archive.ubuntu.com:80 (xxxx)。-连接(111:连接被拒绝)”,发现使用--network=host 现在已经解决了我的问题 经过大量故障排除后,这是唯一对我有用的方法。【参考方案4】:我相信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
文件中。
【讨论】:
获取地址名称服务器的具体命令:nmcli device show <interfacename> | grep IP4.DNS
(Ubuntu >= 15) 和 nmcli dev list iface <interfacename> | grep IP4
(Ubuntu Marty Fried.
这是一个更广泛的答案。当我切换到我的办公室网络或网络发生变化时,我总是遇到问题。添加您公司的 DNS 服务器可解决查找问题。
非常有指导意义!很难找到向您展示如何验证问题,然后提供修复(并验证修复是否有效)的答案。很好的故障排除!
嘿,你能帮帮我吗?我有同样的问题,但我的主机是一台 Windows 机器,我试图在其中运行我的 docker 容器并尝试在那里配置 Ubuntu 映像。当您在这里谈论名称服务器时,是指我的Windows机器的DNS服务器地址吗?在这方面,它是主要的还是次要的?
这是我面临的确切问题,因为我的组织阻止了公共 DNS 并在 DOCKER_OPTS 下的 /etc/default/docker 中设置组织的 DNS 工作并解决了问题。所有人都欢呼这个答案......【参考方案5】:
将本地 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)
现在继续构建 docker... :)
【讨论】:
【参考方案6】:对于同样遇到此问题的任何人,我通过编辑 /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
。希望这对同样遇到此问题的人有所帮助。
【讨论】:
如果您指定编辑 docker 文件的方式会很有帮助 在 Ubuntu 18.04 上:ifconfig docker0
【参考方案7】:
我在谷歌搜索后找到了this answer。我使用的是 Windows,所以上面的一些答案不适用于我的文件系统。
基本运行:
docker-machine ssh default
echo "nameserver 8.8.8.8" > /etc/resolv.conf
我相信这只会覆盖与8.8.8.8
一起使用的现有名称服务器。它对我有用!
根据某些 cmets,您可能必须是 root。为此,请发出sudo -i
。
【讨论】:
这在 Windows 10 上对我不起作用,因为ssh
不存在?
@Seanny123 我已经有一段时间没有做任何事情了,但我也在 Windows 10 上。我当时可能一直在使用旧的Docker Toolbox?否则你可能需要enable the Windows SSH Client。我可能会从那个开始。
这对我来说是在我成为 root 后解决的,要做到这一点,请在你进入后发出 sudo -i
【参考方案8】:
我只是想为从搜索引擎中遇到此问题的任何人添加一个迟到的回复。
不要这样做:我曾经在 /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 配置 (before.rules)、禁用 ufw 并从 /etc/default/docker 中删除 iptables=false 恢复了容器的 DNS 解析功能。
我现在期待通过关注these instructions 来重新启用 ufw 功能。
【讨论】:
【参考方案9】:我有同样的问题,并尝试了提到的步骤,但似乎在刷新网络设置之前都不起作用。
步骤:
-
如上所述,将
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true"
添加到/etc/default/docker
。
使用 iptables -t nat -F POSTROUTING
手动刷新 PREROUTING 表内容。运行后,重新启动 docker,它将使用新的 IP 范围初始化 nat 表。
【讨论】:
【参考方案10】:我现在也为此苦苦挣扎了一段时间,但这就是Ubuntu 16.04 x64
为我解决的问题。我希望它也能节省一些人的时间。
在/etc/NetworkManager/NetworkManager.conf
:
注释掉
#dns=dnsmasq
创建(或修改)/etc/docker/daemon.json
:
"dns": ["8.8.8.8"]
-
使用以下命令重新启动 docker:
sudo service docker restart
【讨论】:
似乎与***.com/a/40516974/2308683的解决方案相同 其实不是。 NetworkManager.conf 中的修复对我的情况产生了影响。 我非常怀疑在系统范围内禁用 dnsmasq 是专门针对 Docker 的最佳解决方案 在解决这个问题 2 天后,我正在分享对我有用的方法。【参考方案11】:对我来说同样的问题(在 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 构建现在都在工作。
【讨论】:
【参考方案12】:我今天也遇到了同样的问题,我只是在 /etc/default/docker 中添加了下面一行
DOCKER_OPTS="--dns 172.18.20.13 --dns 172.20.100.29 --dns 8.8.8.8"
然后我重新启动了我的笔记本电脑。
在我的情况下,重新启动 docker daemon 对我来说还不够,我必须重新启动我的笔记本电脑才能使其工作。
【讨论】:
【参考方案13】:在任何其他解决方案上花费太多时间之前,只需重新启动 Docker 并重试。
为我解决了这个问题,在 Windows 10 上使用 Docker Desktop for Windows。
【讨论】:
使用管理员权限重新启动它解决了我的问题。【参考方案14】:就我而言,防火墙是问题所在。暂时禁用它解决了这个问题。我使用nftables
。停止服务就成功了。
sudo systemctl stop nftables.service
【讨论】:
【参考方案15】:在我的系统上(macOS High Sierra 10.13.6
和 Docker 2.1.0.1
)这是由于公司代理造成的。
我通过两个步骤解决了这个问题:
-
在
Preferences>Proxies
中手动配置代理设置
将相同的设置添加到 ~/.docker/config.json
内的 config.json 中,例如:
"proxies":
"default":
"httpProxy": "MYPROXY",
"httpsProxy": "MYPROXY",
"noProxy": "MYPROXYWHITELIST"
【讨论】:
【参考方案16】:在我的例子中,由于我的容器在云环境中,接口的 MTU 不是通常的 1500,而是像 1450,所以我必须配置我的 docker 守护程序以将容器的 MTU 设置为 1450。
"mtu": 1454
看看这个:https://mlohr.com/docker-mtu/
【讨论】:
【参考方案17】:我的系统中有 dnsmasq
用于 dns 解析,它具有解析 URL 的名称服务器。 Docker 将主机系统的/etc/resolv.conf
复制到容器的/etc/resolv.conf
中,因此没有正确的名称服务器。来自docs:
默认情况下,容器会继承主机的 DNS 设置,如 在
/etc/resolv.conf
配置文件中定义。
在主机的/etc/resolv.conf
中添加域名服务器解决了这个问题。
【讨论】:
【参考方案18】:随着最近的更新,(/etc/docker/daemon.json
) 中的以下行是问题的原因:
"bridge": "none"
删除它,并使用以下命令重新启动 docker 服务:sudo systemctl restart docker
操作系统 (Ubuntu 20.04.3 LTS
) 和 Docker (version 20.10.11, build dea9396
)
【讨论】:
以上是关于Docker构建“无法解析'archive.ubuntu.com'”apt-get无法安装任何东西的主要内容,如果未能解决你的问题,请参考以下文章
使用新版Golang1.18多段构建制作docker镜像的踩坑经历
企业运维实战--最全Docker学习笔记1.Docker简介安装部署镜像构建Dockerfile详解镜像构建镜像优化本地私有仓库搭建