Docker build“无法解决‘ archive.ubuntu.com’”apt-get 安装失败

我一直试图运行 Docker build 的各种文件,以前工作过,现在不再工作。

As soon as the Docker file included any line that was to install software it would fail with a message saying that the package was not found.

RUN apt-get -y install supervisor nodejs npm

The common message which showed up in the logs was

Could not resolve 'archive.ubuntu.com'

知道为什么有软件不安装吗?

92913 次浏览

After much headache I found the answer. Could not resolve 'archive.ubuntu.com' can be fixed by making the following changes:

  1. /etc/default/docker中取消注释以下行
    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

  2. 重启 Docker 服务 sudo service docker restart

  3. 删除缓存无效 DNS 设置的所有图像。

  4. 重建后,问题应该得到解决。

这要归功于 Andrew SB

我只是想为搜索引擎中遇到这个问题的人添加一个延迟响应。

不要这样做: 我曾经在/etc/default/docker 中有一个设置 iptables=false的选项。这是因为 ufw 不能工作(所有东西都是打开的,尽管只允许3个端口) ,所以我盲目地跟随这个问题的答案: Uncomplicated Firewall (UFW)在使用 Docker 时不会阻塞任何东西和 < a href = “ https://svenv.nl/unixandlinux/dockerufw”rel = “ nofollow norefrer”> This,这在评论中有链接

I have a very low understanding of iptables rules / nat / routing in general, hence why I might have done something irrational.

事实证明,我可能配置错误,并在我的容器中关闭了 DNS 解析。当我运行一个交互式容器终端时: < code > 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 解析功能。

I'm now looking forward to re-enable ufw functionality by following these instructions instead.

我相信 Matt Carrier 的回答是这个问题的正确解决方案。但是,在实现它之后,我仍然观察到相同的行为: could not resolve 'archive.ubuntu.com'

这导致我最终发现我所连接的网络阻塞了公共 DNS。这个问题的解决方案是将我的 Docker 容器配置为使用与我的主机(运行 Docker 的机器)相同的名称服务器。

我是如何分类的:

  1. Since I was working through the Docker documentation, I already had an example image installed on my machine. I was able to start a new container to run that image and create a new bash session in that container: docker run -it docker/whalesay bash
  2. 该容器是否有 Internet 连接? : ping 172.217.4.238(google.com)
  3. Can the container resolve hostnames? ping google.com

在我的案例中,第一个 ping导致响应,第二个没有。

解决方法:

Once I discovered that DNS was not working inside the container, I verified that I could duplicate the same behavior on the host. nslookup google.com resolved just fine on the host. But, nslookup google.com 8.8.8.8 or nsloookup google.com 8.8.4.4 timed out.

接下来,我通过运行 nm-tool(在 Ubuntu 14.04上)找到了我的主机正在使用的名称服务器。为了获得快速反馈,我再次启动了示例映像,并将名称服务器的 IP 地址添加到容器的 Resolv.conf 文件: sudo vi /etc/resolv.conf。保存之后,我再次尝试 ping (ping google.com) ,这次成功了!

请注意,对容器的 relv.conf 所做的更改是不持久的,并且将在容器重新启动时丢失。在我的例子中,更合适的解决方案是将我的网络名称服务器的 IP 地址添加到主机的 /etc/default/docker文件中。

我在谷歌搜索之后找到了 这个答案。我使用的是 Windows,所以上面的一些答案并不适用于我的文件系统。

基本上就是:

docker-machine ssh default
echo "nameserver 8.8.8.8" > /etc/resolv.conf

这只是覆盖了现有的名称服务器与 8.8.8.8使用,我相信。它为我工作!

根据一些注释,您可能必须是 root 用户。

在添加本地 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)

现在继续建造码头... :)

我有同样的问题,并尝试提到的步骤,但似乎没有工作,直到刷新网络设置。

步骤:

  1. 如前所述,将 DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true"添加到 /etc/default/docker
  2. 使用 iptables -t nat -F POSTROUTING手动刷新 PREROUTING 表内容。运行此命令后,重新启动 docker,它将使用新的 IP 范围初始化 nat 表。

取消 /etc/default/docker中的 DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4",就像 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

如果命令看起来是挂起的,但最终出现了错误“ can’t Solution‘ 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/dockerDOCKER_OPTS应该可以解决这个问题,但是不管是什么原因,这对我来说不起作用。我在下面描述了对我有效的方法。

解决方案 :

On the host (I'm using Ubuntu 16.04), find out the primary and secondary DNS server addresses:

$ 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

现在重启码头:

$ 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

参考文献 :

I based my solution on an article by Robin Winslow, who deserves all of the credit for the solution. Thanks, Robin!

“修复 Docker 的网络 DNS 配置”Robin Winslow 获取日期: 2016-11-09 https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/

我今天也遇到了同样的问题,我只是在/etc/default/docker 下面添加了一行

DOCKER_OPTS="--dns 172.18.20.13 --dns 172.20.100.29 --dns 8.8.8.8"

然后我重启了我的笔记本电脑。

在我的情况下,重新启动 Docker 守护进程是不够的,我必须重新启动我的笔记本电脑,使其工作。

对于任何人谁也有这个问题,我解决了我的问题编辑 /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在我的情况下。希望这可以帮助任何人谁也有这个问题。

我也有同样的问题(在 Ubuntu Xenial 上)。

  • docker run --dns ... for containers worked.
  • 更新 docker build的 docker 守护进程选项(docker-compose 等)不起作用。

在分析了 docker 日志(journalctl -u docker.service)之后,如果发现应用了一些关于错误 Resolvconf 的警告。

接下来,我发现我们的公司名称服务器被添加到网络接口中,但是没有添加到 Resolvconf 中。

应用此解决方案 如何在接口中配置静态 DNS? (askubuntu) ,即将名称服务器添加到 /etc/resolvconf/resolv.conf.d/tail

在更新 Resolvconf (或重新启动)之后。

Bash docker run --rm busybox nslookup google.com

worked instantly.

我所有的码头构图都正常工作了。

我遇到了同样的问题,但是取消 /etc/default/docker dns 条目的注释,以及编辑构建容器或 /etc/docker/daemon.json中的 /etc/Resolv.conf都没有帮助。

但是在使用选项—— network = host 构建之后,解析功能又恢复正常了。

docker build --network=host -t my-own-ubuntu-like-image .

也许这能帮到别人。

在花费太多的时间在其他解决方案之前,simply restart Docker和再试一次。

为我解决了这个问题,在 Windows10上使用 DockerDesktop。

在我的系统上(macOS High Sierra 10.13.6Docker 2.1.0.1) ,这是由于一个公司代理。

我用两个步骤解决了这个问题:

  1. Preferences>Proxies中手动配置代理设置
  2. 将相同的设置添加到 ~/.docker/config.json中的 config.json 中,如下所示:

     "proxies":
    {
    "default":
    {
    "httpProxy": "MYPROXY",
    "httpsProxy": "MYPROXY",
    "noProxy": "MYPROXYWHITELIST"
    }
    }
    

我已经为此挣扎了一段时间,现在以及,但在这里,它为我解决了 Ubuntu 16.04 x64。我也希望能节省别人的时间。

  1. /etc/NetworkManager/NetworkManager.conf: comment out #dns=dnsmasq

  2. 创建(或修改) /etc/docker/daemon.json:

{
"dns": ["8.8.8.8"]
}
  1. 重新启动码头: sudo service docker restart

在我的例子中,由于我的容器处于云环境中,接口的 MTU 不是通常的1500,而是类似于1450,所以我必须配置我的 docker 守护进程,将容器的 MTU 设置为1450。

{
"mtu": 1454
}

看这个 https://mlohr.com/docker-mtu/

对我来说,防火墙才是问题所在。暂时关闭它解决了问题。我用 nftables。终止仪式起了作用。

sudo systemctl stop nftables.service

我的系统中有 dnsmasq用于 dns 解析,它有解析 URL 的命名服务器。Docker 将主机系统的 /etc/resolv.conf复制到容器的 /etc/resolv.conf中,因此没有正确的命名服务器。来自 医生:

默认情况下,容器继承主机的 DNS 设置,如 在 /etc/resolv.conf配置文件中定义。

在主机的 /etc/resolv.conf中添加名称服务器解决了这个问题。

根据最近的更新,(/etc/docker/daemon.json)中的以下行是问题的原因:

{
"bridge": "none"
}

删除它,然后使用: sudo systemctl restart docker重新启动 docker 服务

OS (Ubuntu 20.04.3 LTS) and Docker (version 20.10.11, build dea9396)