it-swarm.com.de

Dockerfile: Docker Build kann keine Pakete herunterladen: centos-> yum, debian/ubuntu-> apt-get hinter dem Intranet

PROBLEM: Jeder Build, dessen Dockerfile von Centos, Ubuntu oder Debian abhängt, kann nicht erstellt werden.

UMGEBUNG: Ich habe ein Mac OS X, auf dem VMWare mit einem Gast Ubuntu 14.04 und Docker ausgeführt wird:

[email protected] ~ $ 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

BEHAVIOR: Mit "Docker Build" können Pakete nicht heruntergeladen werden. Hier ein Beispiel für eine solche Docker-Datei: https://github.com/Krijger/docker-cookbooks/blob/master/jdk8-Oracle/Dockerfile , https://github.com/ottenhoff/centos-Java/blob/master/Dockerfile

Ich weiß, dass wir einen Container mit --dns ausführen können, aber dies ist während der Erstellungszeit.

  • CENTOS

    FROM centosRUN yum install a b c

  • UBUNTU

    FROM ubuntuRUN apt-get install a b c

Benutzer haben berichtet, dass es Probleme mit der DNS-Konfiguration geben könnte, andere, und die Konfiguration lässt die DNS-Server von Google auskommentieren.

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

Trotzdem blieb das Problem bestehen ... Die meisten Benutzer von # docker @ Freenode haben erwähnt, dass es ein Problem mit der DNS-Konfiguration sein könnte ... Hier ist mein Ubuntu:

$ Sudo cat /etc/resolv.conf 
nameserver 127.0.1.1
search localdomain

Ich habe versucht, das gleiche Problem zu ändern ...

31

PROBLEM

Im Gespräch mit einigen Entwicklern bei # docker @ freenode war das Problem für jeden klar: DNS und die Umgebung. Der Build funktioniert gut bei einer normalen Internetverbindung zu Hause. 

LÖSUNG:

Dieses Problem tritt in einer Umgebung mit einem privaten DNS-Server auf oder das Netzwerk blockiert die DNS-Server von Google. Selbst wenn der Docker-Container 8.8.8.8 pingen kann, muss der Build auf denselben privaten DNS-Server hinter Ihrer Firewall oder Ihrem Rechenzentrum zugreifen können.

Starten Sie den Docker-Dämon mit der Option --dns, um auf Ihren privaten DNS-Server zu verweisen, genau wie Ihr Host-Betriebssystem konfiguriert ist. Das wurde durch Versuch und Irrtum festgestellt.

Einzelheiten

In meinem MAC OS X, Host-Betriebssystem, wurde in meiner /etc/resolv.conf ein anderes DNS konfiguriert:

[email protected] ~ (mac) $ cat /etc/resolv.conf
search corp.my-private-company.net
nameserver 172.18.20.13
nameserver 172.20.100.29

Mein Host könnte die Pakete während der Erstellung an die IP-Adresse 8.8.8.8 von Google fallen lassen. Ich habe diese beiden IP-Adressen gerade genommen und unter die Docker-Daemon-Konfiguration von Ubuntu gestellt:

[email protected] ~ $ 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"
...

Der Build funktioniert jetzt wie erwartet!

$ 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

Danke an @BrianF und andere, die im Kanal IRC geholfen haben!

Permanente VM -Lösung - UPDATE 2. JULI 2015

Wir haben jetzt GitHub Enterprise und CoreOS Enterprise Docker Registry im Mix ... Daher war es für mich wichtig, die Firmen-DNS-Server vom Host-Rechner hinzuzufügen, damit die VM auch funktioniert.

Das Ersetzen der Datei /etc/resolv.conf aus dem Gastbetriebssystem durch die Datei /etc/resolv.conf des Hosts hat das Problem ebenfalls gelöst! Docker 1.7.0. Ich habe gerade eine neue VM mit Ubuntu 15.04 unter VMWare Fusion erstellt und hatte dieses Problem erneut ...

/etc/resolv.conf VOR

~/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 NACH *

~/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
38

Ich hatte ziemlich dasselbe Problem. Die angebotene Lösung hat in meinem Fall nicht geholfen. Es funktionierte jedoch, sobald ich mein Dockerfile aktualisiert hatte und Umgebungsvariablen für den Proxy darin hinzufügte.

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>
8
Anton

Dies ist wahrscheinlich darauf zurückzuführen, dass Ihr lokaler Zwischenspeicherungsnamenserver 127.0.1.1 überwacht, auf den nicht aus dem Container zugegriffen werden kann.

Versuchen Sie, Folgendes in Ihre Dockerfile einzufügen:

CMD "sh" "-c" "echo nameserver 8.8.8.8 > /etc/resolv.conf"
5
Wil Tan

auch das Hinzufügen der Nameserver vom Host (in meinem Fall Mac OSX) zur Docker-Maschine vm löst das Problem.

2
resultsway

Für mich bestand das Problem darin, dass mein Internetdienstanbieter Googles DNS (8.8.8.8) blockierte, das das Andockgerät als Ausweichstandard verwendet.

Der Trick hier ist, Ihre DNS-IP herauszufinden und Andock anweisen, es zu verwenden.

In meinem Fall (unter Ubuntu 17.04) funktionierte der Versuch, diese Informationen von /etc/resolv.conf zu erhalten, nicht, aber ich habe diesen Befehl verwendet:

nmcli dev show | grep IP4.DNS

Dann nahm ich diese IP und fügte in /etc/defaults/docker hinzu:

DOCKER_OPTS="--dns 192.168.50.1"

Starten Sie nun Ihren Docker-Daemon neu und versuchen Sie es erneut.

1
Lucas Lobosque

In meinem Fall besteht das Problem darin, dass der DNS unseres Unternehmens in einigen Punkten fehlerhaft ist, was eine Manipulation des /etc/hosts und für Docker /etc/docker/daemon.json erforderlich macht. Das ist die Datei, die den Fehler versteckte:

{
    "dns": ["10.5...", "10.5...", "10.5..."]
}

Ich habe dies gesichert und durch ersetzt

{
    "dns": ["8.8.8.8", "8.8.4.4"]
}

Und es fing an zu arbeiten. Ich bin auf der Suche nach einer Lösung, die in jedem Fall funktionieren würde - bei unserem VPN, das die benutzerdefinierten DNS-Server benötigt, sowie zu Hause in einem normalen Netzwerk.

Beachten Sie, dass unter modernen Linux /etc/hosts generiert wird und DNS von SystemD verwaltet wird. Ich bin nicht sicher, wie Docker damit umgeht, aber vielleicht reicht es aus, um auf den falschen DNS-Code von SystemD unter 127.0.0.53 hinzuweisen.

0
Ondra Žižka

Erstellen Sie einen lokalen Repo-Spiegel - dies kann auch als docker-mirror-packages-repo erfolgen.

Führen Sie dann "docker build --add-Host "archive.ubuntu.com:repo-docker-ip" aus, um den Build-Prozess von Ihrem lokalen Spiegelserver herunterzuladen. Das ist nicht nur schneller, sondern sorgt auch für eine bessere Reproduzierbarkeit Ihrer Builds.

Ich verwende das für die Testsuite docker-systemctl-replacement , die die Kompatibilität mit einer Reihe von Distributionen testet, von denen jeder Dutzende von Docker-Wiederherstellungen hat.

0