Docker build “Impossible de résoudre” archive.ubuntu.com “» apt-get ne peut rien installer

J’ai essayé d’exécuter Docker sur différents fichiers qui fonctionnaient auparavant, mais qui ne fonctionnent plus.

Dès que le fichier Docker inclurait une ligne devant installer un logiciel, il échouerait avec un message indiquant que le paquet était introuvable.

RUN apt-get -y install supervisor nodejs npm 

Le message commun qui apparaissait dans les journaux était

 Could not resolve 'archive.ubuntu.com' 

Toute idée de la raison pour laquelle aucun logiciel ne sera installé?

Décommenter DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4" dans /etc/default/docker comme l’a suggéré Matt Carrier ne fonctionnait pas pour moi. Pas plus que mettre les serveurs DNS de mon entreprise dans ce fichier. Mais, il y a une autre façon (lisez la suite).

Tout d’abord, vérifions le problème:

 $ docker run 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 se bloquer, mais finit par cracher l'erreur "ne peut pas 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 transformer l'adresse textuelle de «google.com» en une adresse IP. Ironiquement, 8.8.8.8 est le serveur DNS public de Google . Si nslookup échoue, les serveurs DNS publics tels que 8.8.8.8 peuvent être bloqués par votre société (ce que je suppose pour des raisons de sécurité).

Vous penseriez que l'ajout des serveurs DNS de votre entreprise à DOCKER_OPTS dans /etc/default/docker devrait faire l'affaire, mais pour une raison quelconque, cela n'a pas fonctionné pour moi. Je décris ce qui a fonctionné pour moi ci-dessous.

SOLUTION :

Sur l'hôte (j'utilise Ubuntu 16.04), recherchez les adresses du serveur DNS primaire et secondaire:

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

En utilisant ces adresses, créez un fichier /etc/docker/daemon.json :

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

Mettez ceci dans /etc/docker/daemon.json :

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

Quittez la racine:

 # exit 

Maintenant, redémarrez docker:

 $ sudo service docker restart 

Vérification :

Maintenant, vérifiez que l'ajout du fichier /etc/docker/daemon.json vous permet de résoudre «google.com» en une adresse IP:

 $ docker run 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 

Références :

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

"Correction de la configuration DNS du réseau Docker." Robin Winslow. Récupéré le 2016-11-09. https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/

Après beaucoup de maux de tête, j’ai trouvé la réponse. Could not resolve 'archive.ubuntu.com' peut être corrigé en apportant 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émarrez le redémarrage du service Docker sudo service docker restart

  3. Supprimez toutes les images qui ont mis en cache les parameters DNS non valides.

  4. Construire à nouveau et le problème devrait être résolu.

Crédit à Andrew SB

Je crois que la réponse de Matt Carrier est la solution correcte à ce problème. Cependant, après l’avoir implémenté, j’ai toujours 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 consistait à configurer mon conteneur Docker pour utiliser le même serveur que celui utilisé par mon hôte (la machine sur laquelle j’exécutais Docker).

Comment j’ai sortingé:

  1. Comme je travaillais sur la documentation Docker, j’avais déjà un exemple d’image installé sur ma machine. J’ai pu créer un nouveau conteneur pour exécuter cette image et créer une nouvelle session bash dans ce conteneur: docker run -it docker/whalesay bash
  2. Le conteneur dispose-t-il d’une connexion Internet?: ping 172.217.4.238 (google.com)
  3. Le conteneur peut-il résoudre les noms d’hôte? ping google.com

Dans mon cas, le premier ping donné lieu à des réponses, le second pas.

Comment j’ai corrigé:

Une fois que j’ai découvert que DNS ne fonctionnait pas dans le conteneur, j’ai vérifié que je pouvais reproduire le même comportement sur l’hôte. nslookup google.com sur l’hôte. Mais nslookup google.com 8.8.8.8 ou nsloookup google.com 8.8.4.4 expiré.

Ensuite, j’ai trouvé le ou les serveurs de noms que mon hôte utilisait en lançant nm-tool (sur Ubuntu 14.04). Dans le cadre de la rétroaction rapide, j’ai redémarré l’exemple d’image et ajouté l’adresse IP du serveur de noms au fichier resolv.conf du conteneur: sudo vi /etc/resolv.conf . Une fois enregistré, j’ai de nouveau tenté le ping ( ping google.com ) et cette fois, cela a fonctionné!

Veuillez noter que les modifications apscopes au fichier resolv.conf du conteneur ne sont pas persistantes et seront perdues lors du redémarrage du conteneur. Dans mon cas, la solution la plus appropriée consistait à append l’adresse IP du serveur de noms de mon réseau au fichier /etc/default/docker de l’hôte.

Après avoir ajouté le fichier dns ip local au fichier docker par défaut, il a commencé à fonctionner pour moi … veuillez trouver les étapes ci-dessous …

 $ 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 … 🙂

Je voulais juste append une réponse tardive à toute personne rencontrant ce problème dans les moteurs de recherche.

Ne faites pas cela: j’avais une option dans / etc / default / docker pour définir iptables=false . La raison en était que ufw ne fonctionnait pas (tout était ouvert même si seulement 3 ports étaient autorisés), alors j’ai suivi aveuglément la réponse à cette question: Un pare-feu non compliqué ne bloque rien lors de l’utilisation de Docker. commentaires

J’ai une très faible compréhension des règles iptables / nat / routing en général, d’où pourquoi j’ai pu faire quelque chose d’irrationnel.

Il se trouve que je l’ai probablement mal configuré et j’ai tué la résolution DNS dans mes conteneurs. Lorsque j’ai exécuté un terminal de conteneur 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 

Inverser toute la configuration de ufw (before.rules), désactiver ufw et supprimer iptables = false de / etc / default / docker a 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.

Pour ceux qui rencontrent é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 IP utiliser comme DNS.

Ce n’est qu’après un certain temps que j’ai compris que je devais exécuter ifconfig docker sur l’hôte pour afficher l’adresse 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ésortingca: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. J’espère que cela aidera toute personne qui a aussi ce problème.

J’ai trouvé cette réponse après un peu de Google. J’utilise Windows, donc certaines des réponses ci-dessus ne s’appliquaient pas à mon système de fichiers.

Fondamentalement exécuter:

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

Ce qui écrase juste le serveur de noms existant utilisé avec 8.8.8.8 je crois. Cela a fonctionné pour moi!

J’ai le même problème et j’ai essayé les étapes mentionnées, mais rien ne semble fonctionner jusqu’à ce que les parameters réseau soient rafraîchis.

Les marches:

  1. Comme mentionné, ajoutez DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true" à /etc/default/docker .
  2. Rincez manuellement le contenu de la table PREROUTING en utilisant iptables -t nat -F POSTROUTING . Après avoir exécuté ceci, redémarrez docker et il initialisera la table nat avec la nouvelle plage IP.

Même problème pour moi (sur Ubuntu Xenial).

  • docker run --dns ... pour les conteneurs travaillés.
  • La mise à jour des options du démon Docker pour la docker build (docker-compose, etc.) n’a pas fonctionné.

Après avoir analysé les journaux du docker ( journalctl -u docker.service ) si un avertissement concernant un mauvais resolvconf était appliqué.

Après cela, j’ai découvert que nos serveurs de noms d’entreprise étaient ajoutés aux interfaces réseau, mais pas à resolvconf.

Appliqué cette solution Comment configurer mon DNS statique dans les interfaces? (askubuntu) , c’est-à-dire en ajoutant des serveurs de noms à /etc/resolvconf/resolv.conf.d/tail

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

bash docker run --rm busybox nslookup google.com

travaillé instantanément.

Tous mes builds docker-compose fonctionnent maintenant.

Je rencontre le même problème, mais ne commentez pas les entrées de / etc / default / docker dns ni éditez le fichier /etc/resolv.conf dans le conteneur de construction ou le fichier /etc/docker/daemon.json est utile pour moi.

Mais après avoir construit avec l’option –network = host, la résolution était à nouveau correcte.

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

Peut-être que cela aidera encore quelqu’un.

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 puis j’ai redémarré mon portable.

Dans mon cas, le redémarrage du démon Docker ne me suffit pas, je dois redémarrer mon ordinateur portable pour le faire fonctionner.