Docker build"无法解析' archive.ubuntu.com'" apt-get无法安装任何东西

时间:2014-07-28 08:25:08

标签: docker apt-get

我一直在尝试在以前使用过的各种文件上运行Docker,这些文件现在已不再有效了。

一旦Docker文件包含了安装软件的任何行,它就会失败,并显示一条消息,说明找不到该软件包。

RUN apt-get -y install supervisor nodejs npm

日志中显示的常见消息是

Could not resolve 'archive.ubuntu.com'

知道为什么不安装任何软件?

16 个答案:

答案 0 :(得分:229)

DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"中取消注释/etc/default/docker Matt Carrier建议 NOT 为我工作。也没有将我公司的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

如果该命令似乎挂起,但最终发出错误&#34;无法解析&#39; google.com&#39;&#34;,那么您遇到与我相同的问题。

nslookup命令查询DNS服务器8.8.8.8,以便转换&#39; google.com&#39;的文本地址。到IP地址。具有讽刺意味的是,8.8.8.8是Google's public DNS server。如果nslookup失败,贵公司可能会阻止 公共DNS服务器(如8.8.8.8) (我认为这是出于安全原因)。

您认为将公司的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”&#39;到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撰写的一篇文章,他应该得到解决方案的所有功劳。谢谢,罗宾!

&#34;修复Docker的网络DNS配置。&#34;罗宾温斯洛。检索2016-11-09。 https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/

答案 1 :(得分:84)

经过多次头痛我找到了答案。 Could not resolve 'archive.ubuntu.com'可以通过进行以下更改来修复:

  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. 再次构建,问题应该解决。
  5. 信用转到Andrew SB

答案 2 :(得分:23)

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

但是在使用选项--network = host构建之后,解析再次正常。

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

也许这会再次帮助别人。

答案 3 :(得分:15)

我相信Matt Carrier's answer是解决此问题的正确方法。但是,在实现之后,我仍然观察到相同的行为:could not resolve 'archive.ubuntu.com'

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

我如何分类:

  1. 由于我正在使用Docker文档,因此我已经在我的计算机上安装了示例图像。我能够启动一个新容器来运行该映像并在该容器中创建一个新的bash会话:docker run -it docker/whalesay bash
  2. 容器是否有互联网连接?:ping 172.217.4.238(google.com)
  3. 容器可以解析主机名吗? ping google.com
  4. 在我的情况下,第一个ping导致了回复,第二个没有。

    我如何解决:

    一旦我发现DNS在容器内部无法正常工作,我就确认我可以在主机上复制相同的行为。 nslookup google.com在主机上解决得很好。但是,nslookup google.com 8.8.8.8nsloookup 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文件中。

答案 4 :(得分:7)

将本地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)

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

答案 5 :(得分:7)

对于也遇到此问题的任何人,我通过编辑/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 。希望这可以帮助任何有这个问题的人。

答案 6 :(得分:5)

我只想为搜索引擎遇到此问题的任何人添加延迟回复。

不要这样做:我以前在/ etc / default / docker中有一个选项来设置iptables=false。这是因为ufw不起作用(即使只允许3个端口,所有内容都已打开)所以我盲目地按照这个问题的答案:Uncomplicated Firewall (UFW) is not blocking anything when using Dockerthis, 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功能。

答案 7 :(得分:4)

经过一些谷歌搜索后我找到了this answer。我正在使用Windows,因此上述一些答案不适用于我的文件系统。

基本上运行:

public static void main(String[] args) {
int _k = 3;
JFrame frame = new JFrame("Game");
frame.setLayout(new GridLayout(7, 6));
List<JButton> jbl = new ArrayList<>();
    for (int i = 0; i < _k; i++) {
        jbl.add(new JButton(":)" + i));
        jbl.get(i).addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println(((JButton) e.getSource()).getText());
            }
        });
        frame.add(jbl.get(i)); // This is the part I'm talking
    }
frame.getContentPane().add(new gameBoard());
frame.pack();
frame.setVisible(true);
}

我认为只会覆盖与docker-machine ssh default echo "nameserver 8.8.8.8" > /etc/resolv.conf 一起使用的现有名称服务器。它对我有用!

答案 8 :(得分:3)

我遇到了同样的问题,并尝试了上述步骤,但在刷新网络设置之前似乎无效。

步骤:

  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表。

答案 9 :(得分:3)

同样的问题(在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版本现在都在运行。

答案 10 :(得分:2)

今天我遇到了同样的问题,我刚刚将以下行添加到/ etc / default / docker

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

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

在我的情况下,重新启动docker守护程序对我来说还不够,我必须重启我的笔记本电脑才能使它工作。

答案 11 :(得分:2)

我现在也为此付出了一些努力,但这正是在/etc/NetworkManager/NetworkManager.conf上为我解决的原因。我希望它也可以节省别人的时间。

  1. #dns=dnsmasq中: 注释掉 /etc/docker/daemon.json

  2. 创建(或修改){ "dns": ["8.8.8.8"] }

sudo service docker restart
  1. 使用以下命令重启docker: i.F

答案 12 :(得分:1)

就我而言,防火墙是问题所在。暂时禁用它解决了这个问题。我使用nftables。停止服务成功了。

sudo systemctl stop nftables.service 

答案 13 :(得分:0)

在花太多时间在其他任何解决方案上之前,只需重新启动Docker ,然后重试。

在Windows 10上使用Windows的Docker桌面为我解决了问题。

答案 14 :(得分:0)

在我的系统(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"
      }
    }
    

答案 15 :(得分:0)

在我的情况下,由于我的容器位于云环境中,因此接口的MTU通常不为1500,而是1450,因此我必须配置docker daemon来将容器的MTU设置为1450。

some_post = Post.objects.get(id='the_post_id')
print(some_post.username) # prints some_post.user.username

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