web-dev-qa-db-fra.com

La compilation de Docker "Impossible de résoudre 'archive.ubuntu.com'", apt-get ne parvient pas à installer quoi que ce soit

J'essayais d'exécuter Docker à partir de divers fichiers qui fonctionnaient auparavant et qui ne fonctionnent plus.

Dès que le fichier Docker incluait une ligne destinée à installer un logiciel, un message indiquant que le package était introuvable échouait.

RUN apt-get -y install supervisor nodejs npm

Le message commun apparaissant dans les journaux était

Could not resolve 'archive.ubuntu.com'

Une idée pourquoi aucun logiciel ne sera pas installé?

92
Matt Carrier

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 service Docker Sudo service docker restart

  3. Supprimez toutes les images ayant mis en cache les paramètres DNS non valides.

  4. Reconstruisez et le problème devrait être résolu.

Le crédit va à Andrew SB

85
Matt Carrier

Décommenter DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4" Dans /etc/default/docker En tant que Matt Carrier suggéré [~ # ~] pas [~ # ~] travaille pour moi. Pas plus que mettre les serveurs DNS de ma société dans ce fichier. Mais, il y a un autre moyen (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 se bloquer, mais finalement, l'erreur "ne peut pas résoudre" google.com "", 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 de texte de "google.com" en adresse IP. Ironiquement, 8.8.8.8 est serveur DNS public de Google . Si nslookup échoue, des serveurs DNS publics tels que 8.8.8.8 pourraient être bloqués par votre société ( que je suppose est pour des raisons de sécurité).

On pourrait penser que l'ajout du serveur DNS de votre entreprise à DOCKER_OPTS Dans /etc/default/docker Devrait suffire, mais pour une raison quelconque, cela ne m'a pas fonctionné. Je décris ce qui a fonctionné pour moi ci-dessous.

[~ # ~] solution [~ # ~] :

Sur l'hôte (j'utilise Ubuntu 16.04), recherchez les adresses de serveur DNS principal 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"]                                                                           
}     

Sortir de 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 --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

[~ # ~] fait référence à [~ # ~] :

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

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

235
Matthew Kraus

Je rencontre le même problème, mais neiter aucun commentaire / etc/default/docker entrées dns ni la modification de / etc/resolv.conf dans le conteneur de construction ou le /etc/docker/daemon.json m'aide.

Mais après avoir construit avec l'option --network = Host, la résolution était à nouveau satisfaisante.

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

Peut-être que cela aidera quelqu'un à nouveau.

32
Gerald Hansen

Je crois que réponse de Matt Carrier est la solution correcte à ce problème. Cependant, après l'avoir implémenté, j'ai quand même observé le même comportement: could not resolve 'archive.ubuntu.com'.

Cela m'a finalement amené à constater 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 de noms que mon hôte (la machine à partir de laquelle j'exécutais Docker) utilisait.

Comment j'ai trié:

  1. Comme je travaillais dans la documentation Docker, un exemple d’image était déjà installé sur mon ordinateur. J'ai pu démarrer 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 a-t-il 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 a donné lieu à des réponses, pas le second.

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 dupliquer le même comportement sur l'hôte. nslookup google.com Résolu parfaitement sur l'hôte. Mais, nslookup google.com 8.8.8.8 Ou nsloookup google.com 8.8.4.4 A expiré.

Ensuite, j'ai trouvé le ou les serveurs de noms utilisés par mon hôte en exécutant nm-tool (Sur Ubuntu 14.04). Dans la foulée des retours rapides, 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 sauvegardé, j’ai tenté à nouveau le ping (ping google.com) Et cette fois, cela a fonctionné!

Veuillez noter que les modifications apportées 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 à ajouter l'adresse IP du serveur de noms de mon réseau au fichier /etc/default/docker De l'hôte.

15
TMcManemy

Pour ceux qui ont aussi ce problème, j'ai résolu mon problème en éditant la /etc/default/docker fichier, comme suggéré par d’autres réponses et questions. Cependant, je ne savais pas quelle adresse IP utiliser comme DNS.

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

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. J'espère que cela aidera tous ceux qui ont également ce problème.

7
Vini.g.fer

Après avoir ajouté l'ip local du DNS 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 ... :)

7
Prakash N D

Je voulais juste ajouter une réponse tardive à toute personne rencontrant ce problème à partir des moteurs de recherche.

NE PAS faire ceci: J'avais l'habitude d'avoir une option dans/etc/default/docker pour définir iptables=false. Ceci était dû au fait que ufw ne fonctionnait pas (tout était ouvert alors que 3 ports seulement étaient autorisés). J'ai donc suivi aveuglément la réponse à cette question: Un pare-feu compliqué (UFW) ne bloque pas l'utilisation de Docker = et ceci, qui était lié dans les commentaires

J'ai une très faible compréhension des règles iptables/nat/routage en général, ce qui explique pourquoi j'aurais pu faire quelque chose d'irrationnel.

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

La restauration de toute ma configuration ufw (before.rules), la désactivation de ufw et la suppression de iptables = false dans/etc/default/docker ont restauré la fonctionnalité de résolution DNS des conteneurs.

Je suis maintenant impatient de réactiver la fonctionnalité ufw en suivant ces instructions .

5
Hay

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

Fondamentalement dirigé:

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

Ce qui remplace simplement le serveur de noms existant utilisé avec 8.8.8.8 Je crois. Cela a fonctionné pour moi!

4
Engineero

J'ai le même problème et j'ai essayé les étapes mentionnées, mais aucune ne semble fonctionner jusqu'à ce que les paramètres réseau soient actualisés.

Les marches:

  1. Comme mentionné, 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 PREROUTING à l’aide de la touche iptables -t nat -F POSTROUTING. Après avoir exécuté ceci, redémarrez le menu fixe et il initialisera la table nat avec la nouvelle plage IP.
3
JQian

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

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

Après avoir analysé les journaux du menu fixe (journalctl -u docker.service) si un avertissement relatif à une mauvaise résolution a été appliqué.

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

Applied this solution Comment configurer mon DNS statique dans des 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 le redémarrage).

bash docker run --rm busybox nslookup google.com

travaillé instantanément.

Toutes mes versions composées par docker fonctionnent maintenant.

3
mkoertgen

J'ai le même problème aujourd'hui, je viens d'ajouter la ligne ci-dessous dans/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 ordinateur 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.

2
Yusuf Ibrahim

Avant de consacrer trop de temps aux autres solutions, redémarrez simplement Docker et réessayez.

Résolu le problème en utilisant Docker Desktop pour Windows sous Windows 10.

2
CGFoX

Sur mon système (macOS High Sierra 10.13.6 avec Docker 2.1.0.1) cela était dû à un proxy d'entreprise.

J'ai résolu ceci en deux étapes:

  1. Configurez manuellement les paramètres de proxy dans Preferences>Proxies
  2. Ajoutez les mêmes paramètres à votre config.json dans ~/.docker/config.json comme:

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