PROBLÈME: Toute construction, avec un fichier Docker dépendant de centos, ubuntu ou debian, échoue.
ENVIRONNEMENT: J'ai un Mac OS X, exécutant VMWare avec un invité Ubuntu 14.04, exécutant Docker:
mdesales@ubuntu ~ $ Sudo docker version
Client version: 1.1.2
Client API version: 1.13
Go version (client): go1.2.1
Git commit (client): d84a070
Server version: 1.1.2
Server API version: 1.13
Go version (server): go1.2.1
Git commit (server): d84a070
COMPORTEMENT: L’utilisation de "docker build" ne parvient pas à télécharger les packages. Voici un exemple de fichier Dockerfile: https://github.com/Krijger/docker-cookbooks/blob/master/jdk8-Oracle/Dockerfile , https://github.com/ottenhoff/centos-Java/blob/master/Dockerfile
Je sais que nous pouvons exécuter un conteneur avec --dns, mais cela se passe pendant la compilation.
CENTOS
DE centosRUN miam installer un b c
UBUNTU
DE ubuntuRUN apt-get installer a b c
Les utilisateurs ont signalé qu'il pourrait s'agir de problèmes de configuration DNS, d'autres problèmes et que les serveurs DNS de Google ont commenté la configuration.
Step 2 : RUN yum install -y curl; yum upgrade -y; yum update -y; yum clean all
---> Running in 5f11b65c87b8
Loaded plugins: fastestmirror
Couldn't resolve Host 'mirrorlist.centos.org
Le problème persistait toujours ... La plupart des utilisateurs de # docker @ Freenode ont donc mentionné qu'il pourrait s'agir d'un problème de configuration DNS ... Alors voici mon Ubuntu:
$ Sudo cat /etc/resolv.conf
nameserver 127.0.1.1
search localdomain
J'ai essayé de changer ça, même problème ...
PROBLÈME
En parlant à quelques développeurs de # docker @ freenode, le problème était clair pour tout le monde: le DNS et l'environnement. La construction fonctionne très bien avec une connexion Internet régulière à la maison.
SOLUTION:
Ce problème se produit dans un environnement doté d'un serveur DNS privé ou le réseau bloque les serveurs DNS de Google. Même si le conteneur de menu fixe peut exécuter une commande ping sur 8.8.8.8, la construction doit toujours avoir accès au même serveur DNS privé situé derrière votre pare-feu ou votre centre de données.
Démarrez le démon Docker avec le commutateur --dns pour qu'il pointe vers votre serveur DNS privé, tout comme votre système d'exploitation hôte est configuré. Cela a été trouvé par essais et erreurs.
Détails
Mon MAC OS X, OS hôte, avait un DNS différent configuré sur mon /etc/resolv.conf:
mdesales@Marcello-Work ~ (mac) $ cat /etc/resolv.conf
search corp.my-private-company.net
nameserver 172.18.20.13
nameserver 172.20.100.29
Mon hôte est peut-être en train de déposer les paquets à l'adresse IP de Google 8.8.8.8 lors de la construction ... Je viens de prendre ces 2 adresses IP et de les placer dans la configuration du démon dockeur d'Ubuntu:
mdesales@ubuntu ~ $ cat /etc/default/docker
...
...
# Use DOCKER_OPTS to modify the daemon startup options.
DOCKER_OPTS="--dns 172.18.20.13 --dns 172.20.100.29 --dns 8.8.8.8"
...
La construction fonctionne maintenant comme prévu!
$ Sudo ./build.sh
Sending build context to Docker daemon 7.168 kB
Sending build context to Docker daemon
Step 0 : FROM centos
---> b157b77b1a65
Step 1 : MAINTAINER [email protected]
---> Running in 49bc6e233e4c
---> 2a380810ffda
Removing intermediate container 49bc6e233e4c
Step 2 : RUN yum install -y curl; yum upgrade -y; yum update -y; yum clean all
---> Running in 5f11b65c87b8
Loaded plugins: fastestmirror
Determining fastest mirrors
* base: mirror.supremebytes.com
* extras: centos.mirror.ndchost.com
* updates: mirrors.tummy.com
Resolving Dependencies
--> Running transaction check
---> Package systemd.x86_64 0:208-11.el7 will be updated
---> Package systemd.x86_64 0:208-11.el7_0.2 will be an update
---> Package systemd-libs.x86_64 0:208-11.el7 will be updated
---> Package systemd-libs.x86_64 0:208-11.el7_0.2 will be an update
--> Finished Dependency Resolution
Merci à @BrianF et aux autres personnes qui ont contribué au canal IRC!
Permanent VM Solution - MISE À JOUR DU 2 JUILLET 2015
Nous avons maintenant GitHub Enterprise et CoreOS Enterprise Docker Registry dans le mixage ... Il était donc important pour moi d'ajouter les serveurs DNS de l'entreprise à partir de la machine hôte afin que le VM fonctionne également.
Remplacer le fichier /etc/resolv.conf de l'OS invité par le fichier /etc/resolv.conf de l'hôte a également résolu le problème! Docker 1.7.0. Je viens de créer un nouveau VM en utilisant Ubuntu 15.04 sur VMWare Fusion et j'ai eu ce problème à nouveau ...
/etc/resolv.conf AVANT
~/dev/github/public/stackedit on ⭠ master ⌚ 20:31:02
$ cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1
search localdomain
/etc/resolv.conf APRES *
~/dev/github/public/stackedit on ⭠ master ⌚ 20:56:09
$ cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
search corp.mycompany.net
nameserver 10.180.194.35
nameserver 10.180.194.36
nameserver 192.168.1.1
J'ai eu à peu près le même problème. La solution fournie n'a pas aidé dans mon cas. Mais cela a fonctionné dès que j'ai mis à jour mon fichier Dockerfile en y ajoutant des variables d'environnement pour le proxy.
ENV HTTP_PROXY http://<proxy_Host>:<port>
ENV HTTPS_PROXY http://<proxy_Host>:<port>
ENV http_proxy http://<proxy_Host>:<port>
ENV https_proxy http://<proxy_Host>:<port>
Cela est probablement dû au fait que votre serveur de noms en cache local écoute 127.0.1.1, qui n'est pas accessible depuis le conteneur.
Essayez de mettre ce qui suit dans votre Dockerfile
:
CMD "sh" "-c" "echo nameserver 8.8.8.8 > /etc/resolv.conf"
en outre, le simple ajout des serveurs de noms de l'hôte (dans mon cas, mac osx) à la machine à sous docker vm résout le problème.
Pour moi, le problème était que mon FAI bloquait le DNS de Google (8.8.8.8) que docker utilise par défaut.
Le truc ici est de trouver votre adresse IP DNS et de dire à docker de l’utiliser.
Dans mon cas (sous Ubuntu 17.04), essayer d'obtenir cette information à partir de /etc/resolv.conf
n'a pas fonctionné, mais j'ai utilisé cette commande:
nmcli dev show | grep IP4.DNS
Ensuite, j'ai pris cette adresse IP et ajouté dans /etc/defaults/docker
:
DOCKER_OPTS="--dns 192.168.50.1"
Maintenant, redémarrez votre démon docker et essayez de reconstruire.
Dans mon cas, le problème est que le DNS de notre entreprise est défectueux de plusieurs manières, ce qui nécessite de falsifier le /etc/hosts
, et pour docker, /etc/docker/daemon.json
. C'est le fichier qui cachait l'erreur:
{
"dns": ["10.5...", "10.5...", "10.5..."]
}
J'ai sauvegardé ceci et remplacé par
{
"dns": ["8.8.8.8", "8.8.4.4"]
}
Et ça a commencé à fonctionner. Je recherche une solution qui fonctionnerait dans tous les cas - sur notre réseau privé virtuel (VPN) qui nécessite des serveurs DNS personnalisés ainsi que sur un réseau normal.
Notez que dans Linux moderne, /etc/hosts
est généré et le DNS est géré par SystemD. Je ne suis pas sûr de savoir comment Docker gère cela, mais peut-être que cela pourrait suffire de le diriger vers le faux DNS de SystemD à 127.0.0.53
.
Créer un miroir de dépôt local - ceci peut également être fait en tant que docker-mirror-packages-repo
Exécutez ensuite "docker build --add-Host "archive.ubuntu.com:repo-docker-ip"
pour que le processus de construction soit téléchargé à partir de votre miroir local. C'est non seulement plus rapide, mais cela garantit une meilleure reproductibilité de vos builds.
J'utilise cela pour la suite de tests de docker-systemctl-replacement qui teste la compatibilité avec un certain nombre de distributions, chacune avec des dizaines de reconstructions de dockers.