Docker build «Impossible de résoudre 'archive.ubuntu.com'» apt-get ne parvient pas à installer quoi que ce soit

101

J'ai essayé d'exécuter Docker sur divers fichiers qui fonctionnaient auparavant et qui ne fonctionnent plus.

Dès que le fichier Docker incluait une ligne qui devait installer le logiciel, il échouait avec un message indiquant que le package n'a pas été trouvé.

RUN apt-get -y install supervisor nodejs npm

Le message commun qui apparaissait dans les journaux était

Could not resolve 'archive.ubuntu.com'

Une idée pourquoi aucun logiciel ne s'installe pas?

Matt Carrier
la source
cela se produira lorsque la machine sera déconnectée du net ... J'ai vu cela se produire sur un ordinateur portable Linux avec une nouvelle installation de docker si je ne pose problème qu'au newgrp dockerlieu de faire une déconnexion complète, puis connectez-vous après m'être donné sudo usermod -aG docker myuserid... c'est un cas de pointe pour bien sûr que cela arrive
Scott Stensland

Réponses:

250

Décommentant DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"en /etc/default/dockertant que Matt transporteur suggéré ne pas travailler pour moi. Ni mettre les serveurs DNS de ma société dans ce fichier. Mais, il y a un autre moyen (lisez la suite).

Commençons par vérifier 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 finit par cracher l'erreur "impossible de résoudre" google.com "", vous rencontrez le même problème que moi.

La nslookupcommande interroge le serveur DNS 8.8.8.8 afin de transformer l'adresse texte de «google.com» en adresse IP. Ironiquement, 8.8.8.8 est le serveur DNS public de Google . En cas d' nslookupéchec, les serveurs DNS publics tels que 8.8.8.8 peuvent être bloqués par votre entreprise (ce que je suppose est pour des raisons de sécurité).

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

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 dans /etc/docker/daemon.json:

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

Quitter la racine:

# exit

Maintenant, redémarrez le docker:

$ sudo service docker restart

VÉRIFICATION :

Vérifiez maintenant que l'ajout du /etc/docker/daemon.jsonfichier 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

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 réseau de Docker." Robin Winslow. Récupéré 09/11/2016. https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/

Matthew Kraus
la source
3
J'ai reçu une erreur indiquant que le service ne peut pas être démarré après les modifications. C'est parce que j'ai modifié DOCKER_OPTS dans / etc / default / docker et /etc/init.d/docker. L'annulation des modifications a résolu le problème de démarrage du service docker
Twiebie
7
Cela a fonctionné pour moi (sur un réseau d'entreprise) alors que la solution acceptée n'a pas fonctionné.
David Ebbo
1
Cela a fonctionné pour moi aussi, contrairement à la solution acceptée. J'ai utilisé nslookup pour obtenir l'adresse IP de mon serveur DNS mais pas nmcli.
Necro
2
daemon.json fonctionne aussi pour moi! Et vous pouvez vérifier si votre entreprise a bloqué 8.8.8.8 par cette commande nslookup google.com 8.8.8.8Dans mon cas, c'est donc j'ai cette erreurconnection timed out; no servers could be reached
ROTOGG
3
Je pense que la raison /etc/default/dockern'a pas fonctionné pour certaines personnes est (citant un commentaire du fichier)# THIS FILE DOES NOT APPLY TO SYSTEMD
Jakub Bochenski
88

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 qui ont mis en cache les paramètres DNS non valides.

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

Le mérite revient à Andrew SB

Matt Carrier
la source
7
vous pouvez également ajouter --no-cache = true si vous préférez ne pas faire le n ° 3 ci
jschorr
8
Cela ne fonctionne pas pour moi et je ne sais pas pourquoi. Je me bats ça pendant des semaines.
Corey Ogburn
2
Je cours sous Linux mint donc il n'y a pas de boot2docker. / etc / default / docker est créé et possède l'indicateur DOCKER_OPTS ci-dessus. J'ai redémarré le service, effacé toutes les images et tous les conteneurs mais toujours rien.
Corey Ogburn
2
@CoreyOgburn J'essaierais également le --no-cache = true comme mentionné ci-dessus par jschorr. ex:docker build --no-cache=true ...
Matt Carrier
6
J'ai couru docker build --no-cache=true -t docker-whale .mais rien de différent ne semble s'être produit.
Corey Ogburn
46

Je rencontre le même problème, mais neiter décommenter les entrées / etc / default / docker dns ni modifier le /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 correcte.

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

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

Gerald Hansen
la source
J'obtiens une erreur différente depuis longtemps "Impossible de se connecter à archive.ubuntu.com:80 (xxxx). - connect (111: Connexion refusée)" et j'ai constaté que l'utilisation de --network = host est maintenant corrigée mon problème
Eric Arseneau
Après des tonnes de dépannage, c'est la seule chose qui a fonctionné pour moi.
math0ne
15

Je pense que la réponse de Matt Carrier est la bonne solution à ce problème. Cependant, après la mise en œuvre, je remarquai toujours le même comportement: could not resolve 'archive.ubuntu.com'.

Cela m'a conduit à finalement 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).

Comment j'ai trié:

  1. Depuis que je travaillais sur la documentation Docker, j'avais déjà un exemple d'image installé sur ma machine. 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 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 non.

Comment j'ai réparé:

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

Ensuite, j'ai trouvé le (s) serveur (s) de noms que mon hôte utilisait en exécutant nm-tool(sur Ubuntu 14.04). Dans la veine de rétroaction rapide, j'ai commencé à nouveau l'image par exemple, et a ajouté l'adresse IP du serveur de nom au fichier resolv.conf du conteneur: sudo vi /etc/resolv.conf. Une fois enregistré, 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 des redémarrages du conteneur. Dans mon cas, la solution la plus appropriée était d'ajouter l'adresse IP du serveur de noms de mon réseau au /etc/default/dockerfichier de l'hôte .

TMcManemy
la source
2
Commandes concrètes pour obtenir les adresses des serveurs de noms: nmcli device show <interfacename> | grep IP4.DNS(Ubuntu> = 15) et nmcli dev list iface <interfacename> | grep IP4(Ubuntu <15). Crédit: Marty Fried .
r0estir0bbe
C'est une réponse plus complète. J'ai toujours des problèmes lorsque je passe au réseau de mon bureau ou lorsque le réseau change. L'ajout du serveur DNS de votre entreprise résout le problème de recherche.
gvd
1
Très instructif! Il est rare de trouver des réponses qui vous montrent comment vérifier le problème, puis fournir un correctif (et vérifier que le correctif fonctionne). Excellent dépannage!
Matthew Kraus
Hé, pouvez-vous m'aider? J'ai le même problème mais mon hôte est une machine Windows sur laquelle j'essaie d'exécuter mon conteneur Docker et d'essayer de configurer l'image Ubuntu là-bas. Lorsque vous parlez de serveur de noms ici, cela signifie-t-il l'adresse du serveur DNS de ma machine Windows? Et là aussi, sera-ce le primaire ou le secondaire?
CodeHunter
C'est le problème exact auquel j'ai été confronté lorsque mon organisation a bloqué le DNS public et que la configuration du DNS de l'organisation dans / etc / default / docker sous DOCKER_OPTS a fonctionné et le problème résolu. Tous saluent cette réponse ...
skm
7

Après avoir ajouté l'adresse IP DNS locale au fichier docker par défaut, cela 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 ... :)

Prakash ND
la source
7

Pour tous ceux qui ont également ce problème, j'ai résolu mon problème en éditant le /etc/default/docker fichier, comme suggéré par d'autres réponses et questions. Cependant, je n'avais aucune idée de l'IP à utiliser comme DNS.

Ce n'est qu'après un certain temps que j'ai compris que je devais courir ifconfig dockersur 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é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.1dans mon cas. J'espère que cela aidera tous ceux qui ont également ce problème.

Vini.g.fer
la source
7
Il serait utile que vous spécifiiez la manière dont vous avez modifié votre fichier docker
physincubus
1
Sur Ubuntu 18.04:ifconfig docker0
automorphic
6

J'ai trouvé cette réponse après quelques recherches sur Google. J'utilise Windows, donc certaines des réponses ci-dessus ne s'appliquent pas à mon système de fichiers.

Fondamentalement, exécutez:

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.8je crois. Cela a fonctionné pour moi!

Sur la base de certains commentaires, vous devrez peut-être être root. Pour ce faire, émettez sudo -i.

Engineero
la source
Cela n'a pas fonctionné pour moi sur Windows 10, car sshn'existe pas?
Seanny123
@ Seanny123 ça fait un moment que je n'ai rien fait avec ça, mais j'étais aussi sous Windows 10. J'utilisais peut-être l'ancienne boîte à outils Docker à l'époque? Sinon, vous devrez peut-être activer le client SSH Windows . Je commencerais probablement par ça.
Engineero
1
cela a fonctionné pour moi après que je sois devenu root, pour ce faire, un problème sudo -iune fois que vous êtes
dedans
5

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

Ne faites PAS cela: j'avais l'habitude d'avoir une option dans / etc / default / docker à définir iptables=false. En effet, ufw ne fonctionnait pas (tout était ouvert même si seuls 3 ports étaient autorisés), j'ai donc suivi aveuglément la réponse à cette question: Un pare-feu non compliqué (UFW) ne bloque rien lors de l'utilisation de Docker et ce, qui était lié dans le commentaires

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

Il s'avère que je l'ai probablement mal configuré et tué la résolution DNS dans mes conteneurs. Lorsque j'ai géré 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

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

J'ai maintenant hâte de réactiver la fonctionnalité ufw en suivant ces instructions à la place.

Foins
la source
3

J'ai le même problème et j'ai essayé les étapes mentionnées, mais il semble qu'aucune ne fonctionne jusqu'à l'actualisation des paramètres réseau.

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. Videz manuellement le contenu de la table PREROUTING à l'aide de iptables -t nat -F POSTROUTING. Après avoir exécuté cela, redémarrez le docker et il initialisera la table nat avec la nouvelle plage d'adresses IP.
JQian
la source
3

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 docker build(docker-compose etc.) n'a pas fonctionné.

Après avoir analysé les journaux de docker ( journalctl -u docker.service), si vous avez trouvé un avertissement sur une mauvaise résolution de la résolution appliquée.

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

Appliqué cette solution Comment configurer mon DNS statique dans les interfaces? (askubuntu) , c'est-à-dire ajouter 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

a fonctionné instantanément.

Toutes mes versions de docker-compose fonctionnent maintenant.

mkoertgen
la source
2

J'ai eu le même problème aujourd'hui, je viens d'ajouter la ligne ci-dessous à / etc / default / docker

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

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.

Yusuf Ibrahim
la source
2

Avant de passer trop de temps sur l'une des autres solutions, redémarrez simplement Docker et réessayez.

J'ai résolu le problème en utilisant Docker Desktop pour Windows sur Windows 10.

CGFoX
la source
Le redémarrer avec les droits d'administrateur a résolu le problème dans mon cas.
veine le
1

J'ai également lutté pendant un certain temps avec cela maintenant, mais voici ce qui l'a résolu pour moi Ubuntu 16.04 x64. J'espère que cela fera aussi gagner du temps à quelqu'un.

  1. Dans /etc/NetworkManager/NetworkManager.conf: commenter #dns=dnsmasq

  2. Créer (ou modifier) /etc/docker/daemon.json:

{
    "dns": ["8.8.8.8"]
}
  1. Redémarrez le docker avec: sudo service docker restart
palamunder
la source
Semble être la même solution que stackoverflow.com/a/40516974/2308683
OneCricketeer
Pas vraiment. Le correctif de NetworkManager.conf a fait une différence dans mon cas.
palamunder
Je doute fortement que la désactivation de dnsmasq à l'échelle du système soit la meilleure solution spécifiquement pour Docker
OneCricketeer
Je partage ce qui a fonctionné pour moi après avoir combattu 2 jours avec ce problème.
palamunder
Cela n'a pas fonctionné pour moi
desmond13
0

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

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

  1. Configurer manuellement les paramètres de proxy dans Preferences>Proxies
  2. Ajoutez les mêmes paramètres à votre config.json à l'intérieur ~/.docker/config.jsoncomme:

     "proxies":
    {
      "default":
      {
        "httpProxy": "MYPROXY",
        "httpsProxy": "MYPROXY",
        "noProxy": "MYPROXYWHITELIST"
      }
    }
    
Gustavz
la source