Construction d'un Docker "ne pouvait pas se résoudre "archive.ubuntu.com" apt-get ne parvient pas à installer quoi que ce soit

j'ai essayé D'exécuter Docker construire sur divers fichiers qui fonctionnaient auparavant, qui ne fonctionnent plus maintenant.

dès que le fichier Docker incluait une ligne destinée à installer un logiciel, il échouait avec un message disant que le paquet n'était pas trouvé.

RUN apt-get -y install supervisor nodejs npm

le message commun qui est apparu dans les journaux était

Could not resolve 'archive.ubuntu.com'

vous savez pourquoi un logiciel ne s'installe pas?

69
demandé sur muru 2014-07-28 12:25:08

11 réponses

Décommenter DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4" dans /etc/default/docker comme Matt Transporteur suggéré PAS "1519200920 de travail" pour moi. Pas plus que de mettre les serveurs DNS de ma société dans ce fichier. Mais il y a une autre façon (lisez la suite).

tout d'abord, vérifions le problème:

$ 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

si la commande semble être suspendue, mais finit par cracher l'erreur " ne peut pas se résoudre "google.com'", alors vous avez le même problème que moi.

la commande nslookup interroge le serveur DNS 8.8.8.8 afin de tourner l'adresse de texte de 'google.com' dans une adresse IP. Ironiquement, 8.8.8.8 est le serveur DNS public de Google . Si nslookup échoue, les serveurs DNS publics comme 8.8.8.8 pourraient être bloqués par votre entreprise (ce qui est pour des raisons de sécurité).

on pourrait penser que l'ajout du DNS de votre entreprise les serveurs de DOCKER_OPTS dans /etc/default/docker devraient faire l'affaire, mais pour une raison quelconque, ça n'a pas marché pour moi. Je décris ce qui a fonctionné pour moi ci-dessous.

SOLUTION :

sur l'hôte (J'utilise Ubuntu 16.04), découvrez les adresses des serveurs DNS primaire et secondaire:

$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]:              10.0.0.2
IP4.DNS[2]:              10.0.0.3

à l'aide de ces adresses, créez un fichier /etc/docker/daemon.json :

$ sudo su root
# cd /etc/docker
# touch daemon.json

mettez ceci en /etc/docker/daemon.json :

{                                                                          
    "dns": ["10.0.0.2", "10.0.0.3"]                                                                           
}     

la Sortie de racine:

# exit

redémarrez maintenant docker:

$ sudo service docker restart

VERIFICATION :

vérifiez maintenant que l'ajout du fichier /etc/docker/daemon.json vous permet de résoudre "google.com' dans une adresse 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

REFERENCES :

j'ai basé ma solution sur un article de Robin Winslow, qui mérite tout le mérite de la solution. Merci, Robin!

"Fixer le Panneau de réseautage DNS config."Robin Winslow. Retrieved 2016-11-09. https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns /

189
répondu Matthew Kraus 2018-09-28 23:19:30

après beaucoup de maux de tête, j'ai trouvé la réponse. Could not resolve 'archive.ubuntu.com' peut être corrigé par les modifications suivantes:

  1. Décommentez la ligne suivante dans /etc/default/docker

    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

  2. redémarrer le service Docker sudo service docker restart

  3. supprimer toutes les images qui ont mis en cache les paramètres DNS invalides.

  4. construire à nouveau et le problème doit être résolu.

crédit attribué à Andrew SB

77
répondu Matt Carrier 2014-07-28 08:25:08

je crois que le Matt du Transporteur réponse est la bonne solution pour ce problème. Cependant, après l'avoir implémentée, j'ai quand même observé le même comportement: could not resolve 'archive.ubuntu.com' .

cela m'a amené à découvrir que le réseau auquel j'étais connecté bloquait le DNS public. La solution à ce problème était de configurer mon conteneur Docker pour qu'il utilise le même serveur de noms que mon hôte (la machine à partir de laquelle J'exécutais Docker) utilisait.

Comment j'ai trié:

  1. depuis que je travaillais sur la documentation du Docker, j'avais déjà une image d'exemple installée sur ma machine. J'ai pu démarrer un nouveau conteneur pour exécuter cette image et créer une nouvelle session de bash dans ce conteneur: docker run -it docker/whalesay bash
  2. est-ce que le conteneur a une connexion Internet?: ping 172.217.4.238 (google.com)
  3. peut le conteneur résoudre les noms d'hôtes? ping google.com

dans mon cas, le premier ping a donné lieu à des réponses, le second non.

Comment j'ai résolu:

une fois que j'ai découvert que le DNS ne fonctionnait pas à l'intérieur du conteneur, j'ai vérifié que je pouvais reproduire le même comportement sur l'hôte. nslookup google.com résolu très bien sur l'hôte. Mais, nslookup google.com 8.8.8.8 ou nsloookup google.com 8.8.4.4 chronométré.

ensuite, j'ai trouvé le ou les serveurs de noms que mon hôte utilisait en exécutant nm-tool (sur Ubuntu 14.04). Dans la veine de la rétroaction rapide, j'ai redémarré l'image d'exemple, et j'ai ajouté l'adresse IP du serveur de noms à la résolution du conteneur.fichier conf: sudo vi /etc/resolv.conf . Une fois enregistré, j'ai réessayé le ping ( ping google.com ) et cette fois ça a marché!

veuillez noter que les modifications apportées à la résolution du conteneur.conf ne sont pas persistants et seront perdus à travers conteneur redémarre. Dans mon cas, la solution la plus appropriée était d'ajouter l'adresse IP du serveur de noms de mon réseau au fichier /etc/default/docker de l'hôte.

12
répondu TMcManemy 2017-05-23 11:55:03

après avoir ajouté l'ip DNS locale au fichier docker par défaut, il a commencé à fonctionner pour moi... veuillez trouver ci-dessous les étapes...

$ 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)

maintenant allez-y et construisez le docker... :)

7
répondu Prakash N D 2016-07-28 07:07:44

pour toute personne qui a également ce problème, j'ai résolu mon problème en éditant le fichier /etc/default/docker , comme suggéré par d'autres réponses et questions. Cependant, je n'avais aucune idée de ce que L'IP à utiliser comme le DNS.

ce n'est qu'après un certain temps que j'ai compris que je devais lancer ifconfig docker sur l'hôte pour afficher L'IP de l'interface réseau du docker.

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)

c'était 172.17.0.1 dans mon cas. Espérons que cela aide tous ceux qui sont également avoir ce problème.

6
répondu Vini.g.fer 2017-04-25 12:29:08

je rencontre le MÊME PROBLÈME, MAIS neiter décommente /etc/default/docker les entrées dns ni édite le /etc/resolv.conf dans le conteneur de construction ou le /etc/docker/daemon.json m'aide.

mais après que j'ai construit avec l'option --network=host la résolution était très bien à nouveau.

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

peut-être que ceci aidera quelqu'un à nouveau.

6
répondu Gerald Hansen 2018-05-18 14:01:29

je voulais juste ajouter une réponse tardive pour toute personne venant à travers cette question des moteurs de recherche.

ne faites pas cela: j'avais l'habitude d'avoir une option dans /etc/default/docker pour définir iptables=false . C'était parce que l'ufw ne fonctionnait pas (tout était ouvert même si seulement 3 ports étaient autorisés) donc j'ai suivi aveuglément la réponse à cette question: pare-feu non compliqué (UFW) ne bloque rien en utilisant Docker et cela, qui a été lié dans les commentaires

j'ai une très faible compréhension des règles iptables / nat / routage en général, c'est pourquoi je pourrait faire quelque chose d'irrationnel.

S'avère que je l'ai probablement mal configuré et tué résolution DNS à l'intérieur de mes conteneurs. Quand j'ai couru un terminal à conteneurs interactif: docker run -i -t ubuntu:14.04 /bin/bash

j'ai eu ces résultats:

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

J'inverse toute ma configuration ufw (avant.règles), désactiver ufw et supprimer iptables=false De /etc/default/docker restauré la fonctionnalité de résolution DNS des conteneurs.

je suis maintenant impatient de réactiver la fonctionnalité ufw en suivant ces instructions à la place.

5
répondu Hay 2017-04-13 12:22:38

j'ai trouvé cette réponse après quelques Googleing. J'utilise Windows, de sorte que certaines des réponses ci-dessus ne s'appliquent pas à mon système de fichiers.

essentiellement exécuter:

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

qui écrase juste le serveur de noms existant utilisé avec 8.8.8.8 je crois. Il a travaillé pour moi!

4
répondu Engineero 2016-06-08 17:17:00

j'ai le même problème, et j'ai essayé les étapes mentionnées, mais il semble qu'aucune ne fonctionne jusqu'à rafraîchir les paramètres du réseau.

Les étapes:

  1. comme indiqué, ajouter DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true" à /etc/default/docker .
  2. rincer manuellement le contenu de la table de prétraitement en utilisant le iptables -t nat -F POSTROUTING . Après avoir lancé ceci, redémarrez docker et il initialisera la table nat avec la nouvelle plage IP.
3
répondu JQian 2016-10-12 00:04:40

même numéro pour moi (sur Ubuntu Xenial).

  • docker run --dns ... pour les conteneurs ouvrés.
  • mise à Jour de docker démon options pour docker build (menu fixe-composer etc.) ne fonctionne pas.

après analyse des journaux docker ( journalctl -u docker.service ) si trouvé un avertissement au sujet de la mauvaise résolution appliquée.

après que j'ai constaté que nos serveurs de noms d'entreprise ont été ajoutés aux interfaces réseau mais pas dans resolvconf.

Appliqué cette solution Comment puis-je configurer mes DNS statique dans les interfaces? (askubuntu) , c. à d. ajoutant les serveurs de noms à /etc/resolvconf/resolv.conf.d/tail

après mise à jour de resolvconf (ou redémarrage).

bash docker run --rm busybox nslookup google.com

a fonctionné instantanément.

toutes mes compilations docker-comose fonctionnent maintenant.

3
répondu mkoertgen 2017-09-27 08:09:12

j'ai eu le même problème aujourd'hui, j'ai juste ajouté la ligne ci-dessous à/etc/default / docker

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

et j'ai redémarré mon portable.

dans mon cas redémarrer Docker daemon n'est pas suffisant pour moi, je dois redémarrer mon ordinateur portable pour le faire fonctionner.

2
répondu Yusuf Ibrahim 2017-04-11 06:30:14