web-dev-qa-db-fra.com

Echec de la mise à jour de Docker apt-get

Est-ce que quelqu'un peut m'aider à travailler avec apt-get dans mon conteneur de docker? Chaque fois que j'essaie d'exécuter une commande apt-get dans mon conteneur de menu fixe, la commande échoue. J'exécute Docker version 1.1.1, compiler bd609d2 sur Ubuntu 12.04.

Quand je fais

$ Sudo docker run -i -t ubuntu:14.04 /bin/bash
# apt-get update

Je reçois des erreurs en disant

Impossible de résoudre "archive.ubuntu.com"

J'ai essayé de décommenter la ligne ci-dessous dans/etc/default/docker

DOCKER_OPTS = "- dns 8.8.8.8 - dns 8.8.4.4"

mais je ne peux toujours pas cingler google.com

ping: hôte inconnu 

J'ai confirmé que le conteneur utilise les serveurs DNS 8.8.8.8 et 8.8.4.4

root @ 0baa87fc6322:/# cat /etc/resolv.conf

serveur de noms 8.8.8.8

serveur de noms 8.8.4.4

et je suis capable de faire un ping sur les deux serveurs, donc je suis à peu près sûr qu'un pare-feu ne fait pas que laisser tomber mes paquets.

Toute aide à ce sujet serait appréciée!

Merci!

27
jbadua

Merci pour votre aide! J'ai découvert que c'était un problème de DNS et que c'était à cause d'un pare-feu. Après avoir cherché plus, j'ai trouvé cette question que je ne pouvais pas trouver en cherchant 'docker apt-get fail'

Docker - Les appels réseau échouent lors de la génération d'images sur le réseau d'entreprise

Son problème était semblable au mien et la solution m'a aidé à le faire fonctionner ... J'ai copié sa solution pour quiconque trouve cette question dans le futur.

Ces serveurs Google n'étaient pas accessibles derrière notre pare-feu, ce qui explique pourquoi nous n'avons pu résoudre aucune URL.

La solution consiste à indiquer à Docker les serveurs DNS à utiliser. Ce correctif dépend de la façon dont vous avez installé Docker: Forfait Ubuntu

Si vous avez installé le paquet Ubuntu, éditez/etc/default/docker et ajoutez la ligne suivante:

DOCKER_OPTS = "- dns <votre_serveur_dns_1>> --dns <votre_serveur_dns_2>"

Vous pouvez ajouter autant de serveurs DNS que vous le souhaitez à cette configuration. Une fois que vous avez modifié ce fichier, vous voudrez redémarrer votre service Docker:

Redémarrage du docker de service Sudo

Les binaires

Si vous avez installé Docker via la méthode des fichiers binaires (c'est-à-dire, aucun package), vous définissez les serveurs DNS au démarrage du démon Docker:

Sudo docker -d -D --dns --dns &

26
jbadua

Si vous voyez une erreur comme Could not resolve ..., il s’agit probablement d’une configuration DNS.

La première chose à vérifier est d’exécuter cat /etc/resolv.conf dans le conteneur docker. S'il possède un serveur DNS non valide, tel que nameserver 127.0.x.x, le conteneur ne pourra pas résoudre les noms de domaine en adresses IP. Par conséquent, ping google.com échouera.

La deuxième chose à vérifier est d’exécuter cat /etc/resolv.conf sur la machine hôte. Docker copie essentiellement le /etc/resolv.conf de l'hôte dans le conteneur à chaque démarrage d'un conteneur. Donc, si le /etc/resolv.conf de l'hôte est incorrect, le conteneur de menu fixe le sera également.

Si vous avez trouvé que le /etc/resolv.conf de l'hôte est incorrect, vous avez 2 options:

  1. Coder en dur le serveur DNS dans daemon.json. C'est facile, mais pas idéal si vous vous attendez à ce que le serveur DNS change.

  2. Corrigez le /etc/resolv.conf de l'hôte. C'est un peu plus compliqué, mais il est généré dynamiquement et vous ne codez pas en dur le serveur DNS.


1. Serveur DNS à code fixe dans le menu fixe daemon.json

  • Éditer /etc/docker/daemon.json

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
  • Redémarrez le démon docker pour que ces modifications prennent effet:
    Sudo systemctl restart docker

  • Maintenant, lorsque vous exécutez/démarrez un conteneur, docker va renseigner /etc/resolv.conf avec les valeurs de daemon.json.


2. Corrige le /etc/resolv.conf de l'hôte

A. Ubuntu 16.04 et versions antérieures

  • Pour Ubuntu 16.04 et les versions antérieures, /etc/resolv.conf a été généré dynamiquement par NetworkManager. 

  • Mettez en commentaire la ligne dns=dnsmasq (avec un #) dans /etc/NetworkManager/NetworkManager.conf

  • Redémarrez NetworkManager pour régénérer /etc/resolv.conf:
    Sudo systemctl restart network-manager

  • Vérifiez sur l'hôte: cat /etc/resolv.conf

B. Ubuntu 18.04 et ultérieur

  • Ubuntu 18.04 a changé pour utiliser systemd-resolved AFIN DE G&EACUTE;N&EACUTE;RER /etc/resolv.conf . Maintenant, par défaut, il utilise un cache DNS local 127.0.0.53. Cela ne fonctionnera pas à l'intérieur d'un conteneur. Par conséquent, Docker utilise par défaut le serveur DNS 8.8.8.8 de Google, qui risque de tomber en panne pour les utilisateurs derrière un pare-feu.

  • /etc/resolv.conf est en fait un lien symbolique (ls -l /etc/resolv.conf) qui pointe par défaut sur /run/systemd/resolve/stub-resolv.conf (127.0.0.53) dans Ubuntu 18.04.

  • Il suffit de changer le lien symbolique pour qu'il pointe vers /run/systemd/resolve/resolv.conf, qui répertorie les serveurs DNS réels:
    Sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • Vérifiez sur l'hôte: cat /etc/resolv.conf

Vous devez maintenant avoir un /etc/resolv.conf valide sur l'hôte pour que le menu fixe puisse être copié dans les conteneurs.

8
wisbucky

Commencez par vérifier si vous avez une connexion. Envoyez un ping directement à ip 91.189.92.201 sur lequel archive.ubuntu.com est pointé:

ping 91.189.92.201

Si vous ne parvenez toujours pas à joindre l'hôte, ce n'est pas un problème de DNS.

Aussi, si vous avez une connexion Internet, vous pouvez faire un hack. Il suffit de mettre une ligne dans le fichier /etc/hosts et le problème résolu:

91.189.92.201 archive.ubuntu.com

4
Justas Pukys

Je rencontre le problème dans deux cas différents et la résolution était différente ...

Premier avec Win7 + virtualbox (Xubuntu 16.04) Ce commentaire a fait le job: https://stackoverflow.com/a/29659783/2260796

Je modifie le fichier/etc/default/docker:

DOCKER-OPTS = "- ip-masq = true --dns mon_ip_dns_win --dns 8.8.8.8 --dns 8.8.4.4" Et courir Redémarrage du docker de service Sudo

Deuxième sur un système d'exploitation Xubuntu (ubuntu 16.04) La résolution précédente ne suffisait pas . Ce commentaire a fait le job: https://github.com/docker/ docker/issues/1809 Je devais commenter une ligne du fichier /etc/NetworkManager/NetworkManager.conf: 

dns = dnsmasq

Puis courir

Sudo redémarre le gestionnaire de réseau

2
Garag

J'utilise la version de Mint et après avoir installé Docker et essayé de créer une image d'Ubuntu, la commande apt-get update ne reconnaît pas, pour remédier au problème, j'ai démissionné

docker run -it -p 8080:80  ubuntu /bin/bash
echo "91.189.92.201 archive.ubuntu.com" >> /etc/hosts
cat /etc/hosts
apt-get update
1
cristofersousa