Docker出现名称解析临时失败[Errno -3]错误

92

我正在按照Docker教程的步骤进行学习,现在我需要使用以下命令构建应用程序:

docker build -t friendlyhello .

它达到了第四步,在暂停后,我收到了这个错误:

Step 4/7 : RUN pip install -r requirements.txt
 ---> Running in 7f4635a7510a
Collecting Flask (from -r requirements.txt (line 1))

Retrying (Retry(total=4, connect=None, read=None, redirect=None)) after 
connection broken by
'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.VerifiedHTTPSConnection 
object at 0x7fe3984d9b10>: Failed to establish a new connection: 
[Errno -3] Temporary failure in name resolution',)': /simple/flask/

我不太确定这个错误的含义以及如何解决它。

感谢您的帮助!


5
该错误意味着pip未能解析DNS名称。首先,请检查Docker中的网络是否正常工作。运行 docker -it --rm python:2.7-slim /bin/bash,然后尝试运行 ping pypi.python.orgping -n 8.8.8.8。使用ctrl-D或 exit退出。如果ping失败(请发布结果),则您可能遇到了与网络或DNS有关的问题(在您的问题中更新操作系统详细信息和Docker版本)。如果它可以工作,那么,我想,您可能遇到了Docker或pip的某些错误-尝试添加 --verbose ,这样命令将是 RUN pip install --verbose -r requirements.txt,也许会提供一些有用的信息。 - drdaeman
感谢您的回复。Ping测试确实正常工作,但是您提到的第一个命令却给了我一个错误:“未知的简写-i”。当使用“--verbose”运行时,我得到以下信息:获取页面https://pypi.python.org/simple/flask/ 在缓存中查找“https://pypi.python.org/simple/flask/” 没有可用的缓存条目 - monadoboi
6
@drdaeman提到的第一个命令失败是因为缺少运行命令。请使用以下命令代替:docker run -it --rm python:2.7-slim /bin/bash - yago
2
在构建容器之前,你是否暂停了计算机? 在我的笔记本电脑上,Docker守护程序总是在暂停后停止名称解析。当我再次唤醒笔记本电脑时,我总是需要重新启动守护程序才能使其恢复工作。 - Peter
2
这个回答解决了你的问题吗?企业网络中镜像构建期间网络调用失败 - Ian Kemp
19个回答

87

我刚刚执行了sudo service docker restart命令,然后它正常工作了。在修改配置之前,这绝对值得一试。


13
每次我暂停/唤醒我的笔记本电脑时,都需要这样做,以使docker内的DNS解析恢复正常工作。 - Peter
1
确实是个好建议。在调整配置之前,先尝试基础知识。此外,使用交互式会话进入容器始终是了解问题所在的好方法,在应用解决方案之前进行检查。docker run -it --entrypoint /bin/sh 您的镜像名称在此处输入 - Bruno Bossola
这解决了我的问题。在我的情况下,ExpressVPN会在系统启动时连接,然后如果有什么问题,我会稍后断开连接。这似乎搞乱了Docker。像你建议的那样重新启动服务解决了问题。 - undefined

36

我遇到了与Ubuntu 16.04和Docker版本17.09.0-ce相同的问题。我认为禁用dnsmasq不是正确的解决方法。

这是我的解决办法:

对于Ubuntu

编辑/etc/default/docker,并将您的DNS服务器添加到以下行中:

示例

DOCKER_OPTS="--dns 8.8.8.8 --dns 10.252.252.252"

参考: 公司网络环境下,创建Docker镜像时网络调用失败


我在这里找到了指示:https://docs.docker.com/install/linux/linux-postinstall/#specify-dns-servers-for-docker - technocrat
这对我有效,而编辑 /etc/docker/daemon.json 则无效。 - Matt Upson
这对我在WSL2 Ubuntu 22.04上有效,我遇到了与原帖作者相同的问题(使用不同的Python版本)。 - peschü

30

我认为bkasap的回答夸大了改变系统功能的影响,因为在Docker中有可选项可以实现该操作。新的方法是:

bkasap的回答夸大了改变系统功能的影响,因为在Docker中有可选项可以实现该操作。新的方法是

$ sudo vi /etc/docker/daemon.json

并添加以下内容

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

别忘了

sudo service docker restart

1
你的回答弄坏了我的 Docker,哈哈。 - Alexey Khachatryan

23

这可能有点傻,但我在遇到这个错误时正在使用VPN连接。

断开VPN后,PIP又可以正常工作了。


3
来到这里时,一切都不起作用。结果发现这也是我的问题。 - Daniel Garcia-Briseno
3
谢谢,我都快疯了,哈哈! - WilomGfx
4
哈哈!我也遇到过这种情况!你知道为什么使用 DNS 会导致解析错误吗? - Revanth Reddy
我曾经遇到过同样的问题。我想知道为什么在主机上连接DNS会阻止容器在单个主机组合运行中解析同一Docker网络中其他容器的名称。 - VBobCat
1
这个答案被低估了,因为它对我来说也解决了这个错误。 - undefined

17

在Fedora 32上,防火墙会出现问题。执行以下命令可以解决问题:

$firewall-cmd --permanent --zone=trusted --add-interface=docker0

$firewall-cmd --reload

16

这篇帖子对我也有帮助!

通过禁用 dns mask (dns掩码)来解决:

sudo vim /etc/NetworkManager/NetworkManager.conf

注释掉dns=dnsmasq -> #dns=dnsmasq

sudo service network-manager restart (或在此情况下重新启动虚拟机)

来源:https://github.com/moby/moby/issues/26330


3
为什么每个人都愿意将 masquerading 称为 masking (不只是这个答案)?区别很重要-尤其是为了理解。我们不想只是随便按键直到“它起作用”。我们需要理解什么有效,以及为什么有效。(我知道这是一个引语,但搜索此 SO 帖子中的“mask”即可看到我的观点) - sehe

14
刚刚在我的Ubuntu 20.04上发生了这种情况。它突然间停止工作了! 尝试过:
sudo service network-manager restart

没有效果。然后我只做了这个:

sudo systemctl restart docker

问题已经解决!


2
我这里也遇到了类似的问题。执行 sudo systemctl restart docker 命令就可以解决该问题。谢谢 - cavalcantelucas
在我的情况下,我不得不重新启动机器。因为之前我是通过snap安装的docker。 - Rodislav Moldovan

8
这个错误意味着您的Docker容器无法访问您的网络。从systemd 220版本开始,给定网络的转发设置(net.ipv4.conf..forwarding)默认关闭。此设置防止IP转发。它还与Docker启用容器内的net.ipv4.conf.all.forwarding设置的行为冲突。
如果您的容器需要解析内部网络的主机,公共域名服务器将不足以满足您的需求。你有两个选择:
  1. 您可以指定一个DNS服务器供Docker使用,或
  2. 您可以在NetworkManager中禁用dnsmasq。如果这样做,NetworkManager将会把真正的DNS名称服务器添加到/etc/resolv.conf中,但是您将失去dnsmasq的可能优点。您只需要使用其中一种方法。
您可以在这里了解如何执行这些步骤。

5

我在Ubuntu 16.04.1机器上使用docker-ce 17时遇到了同样的问题。通过禁用网络中的DNS掩码,问题得以解决。

sudo nano /etc/NetworkManager/NetworkManager.conf 

按下Ctrl+O保存,按下Enter退出,按下Ctrl+X

通过运行以下命令重新启动网络服务。

sudo service network-manager restart

如果按照此方式操作,执行docker build命令后一切将正常运作。


这对我起作用了,而添加正确的DNS服务器则没有。 - KthProg

2

我在Windows 10 Pro上遇到了这个问题,通过在托盘中右键单击docker图标并选择“重新启动”,问题得以解决。大约几分钟后,网络恢复正常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接