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?
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 /
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:
-
Décommentez la ligne suivante dans
/etc/default/docker
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
-
redémarrer le service Docker
sudo service docker restart
-
supprimer toutes les images qui ont mis en cache les paramètres DNS invalides.
- construire à nouveau et le problème doit être résolu.
crédit attribué à Andrew SB
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é:
- 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
- est-ce que le conteneur a une connexion Internet?:
ping 172.217.4.238
(google.com) - 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.
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... :)
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.
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.
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.
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!
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:
- comme indiqué, ajouter
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true"
à/etc/default/docker
. - 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.
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.
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.