Dockerfile: docker build ne peut pas télécharger les paquets: centos - >yum, debian / ubuntu - >apt-get behind intranet
Problème: toute construction, avec un Dockerfile dépendant de centos, ubuntu ou debian échoue à construire.
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 paquets. Voici un exemple de Dockerfile: https://github.com/Krijger/docker-cookbooks/blob/master/jdk8-oracle/Dockerfile, https://github.com/ottenhoff/centos-java/blob/master/Dockerfile
Je sachez que nous pouvons exécuter un conteneur avec --dns, mais c'est pendant le temps de construction.
-
CENTOS
De centos Exécuter yum installer un b c
-
UBUNTU
De ubuntu Exécutez apt-get install a b c
Les utilisateurs ont signalé qu'il pourrait y avoir des problèmes avec la configuration DNS, d'autres et la configuration a les serveurs DNS de Google commentés.
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
Toujours le problème a persisté... Ainsi, la plupart des utilisateurs sur #Docker@Freenode ont mentionné que cela pourrait être un problème avec la configuration DNS... Alors voici mon Ubuntu:
$ sudo cat /etc/resolv.conf
nameserver 127.0.1.1
search localdomain
J'ai essayé de changer cela, même problème...
6 réponses
PROBLÈME
En parlant à certains développeurs sur #Docker @ freenode, le problème était clair pour tout le monde: DNS et l'environnement. La construction fonctionne très bien à une connexion Internet régulière à la maison.
SOLUTION:
Ce problème se produit dans un environnement qui a un serveur DNS privé, ou le réseau bloque les serveurs DNS de Google. Même si le conteneur docker peut envoyer un ping 8.8.8.8, la construction doit toujours avoir accès au même serveur DNS privé derrière votre pare-feu ou un Centre de Données.
Démarrez le démon Docker avec le commutateur --dns pour pointer 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, host OS, 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 peut déposer les paquets à L'adresse IP 8.8.8.8 de Google lors de la construction... Je viens de prendre ces adresses IP 2 et de les placer sous le démon Docker D'Ubuntu configuration:
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 Marcello_deSales@intuit.com
---> 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 à d'autres personnes qui ont aidé dans le canal IRC!
Solution VM permanente-mise à jour juillet 2, 2015
Nous avons maintenant GitHub Enterprise et CoreOS Enterprise Docker Registry dans le mélange... Donc, il était important pour moi d'ajouter les serveurs DNS d'entreprise de la machine hôte afin que la machine virtuelle fonctionne également.
Remplacer le /etc/resolv.conf de l'OS invité avec l'Hôte /etc/resolv.conf a également résolu le problème! Docker 1.7.0. Je viens de créer une nouvelle 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 après *
~/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 Dockerfile en 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 de mise en cache local écoute sur 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, l'ajout des serveurs de noms de l'hôte (dans mon cas mac osx ) à la machine virtuelle Docker 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 comme défaut de secours.
L'astuce ici est de trouver votre adresse IP DNS et de dire à docker de l'utiliser.
Dans mon cas (en cours D'exécution 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"
Redémarrez maintenant votre démon docker et réessayez de construire.
Dans mon cas, le problème est que le DNS de notre entreprise est défectueux de quelques façons, 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é cela et remplacé par
{
"dns": ["8.8.8.8", "8.8.4.4"]
}
Et ça a commencé à marcher. Je suis à la recherche d'une solution qui fonctionnerait dans tous les cas - sur notre VPN qui a besoin des serveurs DNS personnalisés ainsi que de la maison sur un réseau normal.
Notez que dans Linux moderne, /etc/hosts
est généré et DNS est géré par SystemD. Je ne sais pas comment Docker gère cela, mais peut-être cela pourrait-il suffire de le pointer vers le faux DNS de SystemD à 127.0.0.53
.