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

 手机用户2502918767 发布于 2022-12-31 19:32

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

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

RUN apt-get -y install supervisor nodejs npm

日志中出现的常见消息是

Could not resolve 'archive.ubuntu.com'

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

7 个回答
  • 在取消DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"/etc/default/docker为马特运营商建议没有为我工作.也没有将我公司的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是谷歌的公共DNS服务器.如果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/

    2022-12-31 19:33 回答
  • 我遇到了同样的问题,但是neet取消注释/ etc/default / docker dns条目,也没有编译构建容器中的/etc/resolv.conf/etc/docker/daemon.json对我有帮助.

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

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

    也许这会再帮助一个人.

    2022-12-31 19:33 回答
  • 将本地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)
    

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

    2022-12-31 19:35 回答
  • 我只想为从搜索引擎遇到这个问题的任何人添加一个迟到的回复.

    不要这样做:我曾经在/ etc/default/docker中设置了一个选项iptables=false.这是因为UFW没有工作(一切都被打开了,即使只有3口被允许),所以我盲从这个问题的答案:不复杂的防火墙(UFW)使用多克时是不会阻止任何与此,这是在联评论

    我对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解析功能.

    我现在期待通过遵循这些说明来重新启用ufw功能.

    2022-12-31 19:35 回答
  • 对于也遇到此问题的任何人,我通过编辑/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我的情况.希望这可以帮助任何有这个问题的人.

    2022-12-31 19:35 回答
  • 经过很多头痛我找到了答案.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

    2022-12-31 19:35 回答
  • 我相信Matt Carrier的答案是解决这个问题的正确方法.然而,在实现它之后,我仍然观察到相同的行为: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文件中.

    2022-12-31 19:35 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有