Docker-Build "archive.ubuntu.com konnte nicht aufgelöst werden" apt-get kann nichts installieren

101

Ich habe versucht, Docker Build auf verschiedenen Dateien auszuführen, die zuvor funktionierten und jetzt nicht mehr funktionieren.

Sobald die Docker-Datei eine Zeile enthielt, in der Software installiert werden sollte, schlug die Meldung fehl, dass das Paket nicht gefunden wurde.

RUN apt-get -y install supervisor nodejs npm

Die allgemeine Meldung, die in den Protokollen angezeigt wurde, war

Could not resolve 'archive.ubuntu.com'

Irgendeine Idee, warum keine Software installiert wird?

Matt Carrier
quelle
Dies wird passieren, wenn der Computer vom Netz getrennt wird ... Ich habe gesehen, dass dies auf einem Linux-Laptop mit einer neuen Docker-Installation passiert, wenn ich nur Probleme habe, newgrp dockeranstatt mich vollständig abzumelden und mich dann anzumelden, nachdem ich mich selbst gegeben habe sudo usermod -aG docker myuserid... es ist ein Vorteil für sicher, aber es passiert
Scott Stensland

Antworten:

250

Uncommenting DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"in /etc/default/dockerals Matt Träger vorgeschlagen hat nicht für mich arbeiten. Auch die DNS-Server meines Unternehmens wurden nicht in diese Datei aufgenommen. Aber es gibt noch einen anderen Weg (lesen Sie weiter).

Lassen Sie uns zunächst das Problem überprüfen:

$ 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

Wenn der Befehl zu hängen scheint, aber schließlich den Fehler "google.com kann nicht behoben werden" ausspuckt, haben Sie das gleiche Problem wie ich.

Der nslookupBefehl fragt den DNS-Server 8.8.8.8 ab, um die Textadresse von 'google.com' in eine IP-Adresse umzuwandeln. Ironischerweise ist 8.8.8.8 der öffentliche DNS-Server von Google . Wenn dies nslookupfehlschlägt, werden öffentliche DNS-Server wie 8.8.8.8 möglicherweise von Ihrem Unternehmen blockiert (was aus Sicherheitsgründen angenommen wird).

Sie würden denken, dass das Hinzufügen von DNS-Servern Ihres Unternehmens zu DOCKER_OPTSin /etc/default/dockerden Trick machen sollte, aber aus irgendeinem Grund hat es bei mir nicht funktioniert. Ich beschreibe unten, was für mich funktioniert hat.

LÖSUNG :

Ermitteln Sie auf dem Host (ich verwende Ubuntu 16.04) die primären und sekundären DNS-Serveradressen:

$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]:              10.0.0.2
IP4.DNS[2]:              10.0.0.3

Erstellen Sie mit diesen Adressen eine Datei /etc/docker/daemon.json:

$ sudo su root
# cd /etc/docker
# touch daemon.json

Geben Sie dies ein /etc/docker/daemon.json:

{                                                                          
    "dns": ["10.0.0.2", "10.0.0.3"]                                                                           
}     

Beenden Sie von root:

# exit

Starten Sie nun Docker neu:

$ sudo service docker restart

ÜBERPRÜFUNG :

Überprüfen /etc/docker/daemon.jsonSie nun, ob Sie durch Hinzufügen der Datei "google.com" in eine IP-Adresse auflösen können:

$ 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

REFERENZEN :

Ich habe meine Lösung auf einen Artikel von Robin Winslow gestützt, der alle Anerkennung für die Lösung verdient. Danke, Robin!

"Korrigieren Sie die Netzwerk-DNS-Konfiguration von Docker." Robin Winslow. Abgerufen am 09.11.2016. https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/

Matthew Kraus
quelle
3
Ich habe eine Fehlermeldung erhalten, dass der Dienst nach den Änderungen nicht gestartet werden kann. Dies lag daran, dass ich DOCKER_OPTS in / etc / default / docker und /etc/init.d/docker geändert habe. Durch das Zurücksetzen der Änderungen wurde das Startproblem des Docker-Dienstes
behoben
7
Dies funktionierte für mich (in einem Unternehmensnetzwerk), während die akzeptierte Lösung dies nicht tat.
David Ebbo
1
Dies funktionierte auch für mich, während die akzeptierte Lösung dies nicht tat. Ich habe nslookup verwendet, um meine DNS-Server-IP zu erhalten, jedoch nicht nmcli.
Necro
2
daemon.json funktioniert auch bei mir! Und Sie können überprüfen, ob Ihre Firma 8.8.8.8 durch diesen Befehl blockiert hat. nslookup google.com 8.8.8.8In meinem Fall ist es so, dass ich diesen Fehler bekamconnection timed out; no servers could be reached
ROTOGG
3
Ich denke, der Grund, warum /etc/default/dockeres für einige Leute nicht funktioniert hat, ist (zitiert einen Kommentar aus der Datei)# THIS FILE DOES NOT APPLY TO SYSTEMD
Jakub Bochenski
88

Nach vielen Kopfschmerzen fand ich die Antwort. Could not resolve 'archive.ubuntu.com'kann durch folgende Änderungen behoben werden:

  1. Kommentieren Sie die folgende Zeile aus /etc/default/docker
    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

  2. Starten Sie den Docker-Dienst neu sudo service docker restart

  3. Löschen Sie alle Bilder, die die ungültigen DNS-Einstellungen zwischengespeichert haben.

  4. Bauen Sie erneut und das Problem sollte gelöst sein.

Der Kredit geht an Andrew SB

Matt Carrier
quelle
7
Sie können auch --no-cache = true hinzufügen, wenn Sie lieber nicht # 3 oben tun
möchten
8
Das funktioniert bei mir nicht und ich habe keine Ahnung warum. Ich kämpfe seit Wochen dagegen.
Corey Ogburn
2
Ich laufe unter Linux Mint, also gibt es keinen Boot2docker. / etc / default / docker wird erstellt und hat oben das Flag DOCKER_OPTS. Ich habe den Dienst neu gestartet, alle Bilder und Container gelöscht, aber immer noch nichts.
Corey Ogburn
2
@CoreyOgburn Ich würde auch versuchen --no-cache = true, wie oben von jschorr erwähnt. Beispiel:docker build --no-cache=true ...
Matt Carrier
6
Ich rannte, docker build --no-cache=true -t docker-whale .aber nichts anderes scheint passiert zu sein.
Corey Ogburn
45

Ich habe das gleiche Problem, aber es hilft mir nicht, / etc / default / docker DNS- Einträge zu kommentieren oder die Datei /etc/resolv.conf im Build-Container oder /etc/docker/daemon.json zu bearbeiten .

Aber nachdem ich mit der Option --network = host erstellt habe, war die Auflösung wieder in Ordnung.

docker build --network=host -t my-own-ubuntu-like-image .

Vielleicht hilft das wieder jemandem.

Gerald Hansen
quelle
Ich habe seit langer Zeit einen anderen Fehler "Konnte keine Verbindung zu archive.ubuntu.com:80 (xxxx) herstellen. - connect (111: Verbindung abgelehnt)" erhalten und festgestellt, dass die Verwendung des Hosts --network = jetzt behoben wurde Mein Problem
Eric Arseneau
Nach tonnenweise Fehlerbehebung ist dies das einzige, was für mich funktioniert hat.
math0ne
15

Ich glaube, dass die Antwort von Matt Carrier die richtige Lösung für dieses Problem ist. Nach der Implementierung habe ich jedoch immer noch das gleiche Verhalten beobachtet : could not resolve 'archive.ubuntu.com'.

Dies führte schließlich dazu, dass das Netzwerk, mit dem ich verbunden war, das öffentliche DNS blockierte. Die Lösung für dieses Problem bestand darin, meinen Docker-Container so zu konfigurieren, dass er denselben Nameserver verwendet, den mein Host (der Computer, auf dem ich Docker ausführte) verwendete.

Wie ich es versucht habe:

  1. Da ich die Docker-Dokumentation durchgearbeitet habe, war bereits ein Beispiel-Image auf meinem Computer installiert. Ich konnte einen neuen Container starten, um dieses Image auszuführen und eine neue Bash-Sitzung in diesem Container zu erstellen:docker run -it docker/whalesay bash
  2. Hat der Container eine Internetverbindung?: ping 172.217.4.238(Google.com)
  3. Kann der Container Hostnamen auflösen? ping google.com

In meinem Fall führte der erste pingzu Antworten, der zweite nicht.

Wie ich behoben habe:

Als ich feststellte, dass DNS im Container nicht funktioniert, habe ich überprüft, ob ich dasselbe Verhalten auf dem Host duplizieren kann. nslookup google.comgut auf dem Host gelöst. Aber nslookup google.com 8.8.8.8oder nsloookup google.com 8.8.4.4abgelaufen.

Als nächstes fand ich die Nameserver, die mein Host beim Ausführen verwendete nm-tool(unter Ubuntu 14.04). Im Sinne eines schnellen Feedbacks habe ich das Beispielbild erneut gestartet und die IP-Adresse des Nameservers zur resolv.conf-Datei des Containers hinzugefügt : sudo vi /etc/resolv.conf. Einmal gespeichert, habe ich den Ping erneut versucht ( ping google.com) und diesmal hat es funktioniert!

Bitte beachten Sie, dass die an der resolv.conf des Containers vorgenommenen Änderungen nicht dauerhaft sind und bei Neustarts des Containers verloren gehen. In meinem Fall bestand die geeignetere Lösung darin, die IP-Adresse des Nameservers meines Netzwerks zur /etc/default/dockerDatei des Hosts hinzuzufügen .

TMcManemy
quelle
2
Konkrete Befehle zum Abrufen der Adressnamenserver: nmcli device show <interfacename> | grep IP4.DNS(Ubuntu> = 15) und nmcli dev list iface <interfacename> | grep IP4(Ubuntu <15). Bildnachweis: Marty Fried .
r0estir0bbe
Dies ist eine ausführlichere Antwort. Ich habe immer Probleme, wenn ich zu meinem Büronetzwerk wechsle oder wenn sich das Netzwerk ändert. Durch Hinzufügen des DNS-Servers Ihres Unternehmens wird das Suchproblem behoben.
gvd
1
Sehr lehrreich! Es ist selten, Antworten zu finden, die Ihnen zeigen, wie Sie das Problem überprüfen und dann einen Fix bereitstellen (und überprüfen, ob der Fix funktioniert). Tolle Fehlerbehebung!
Matthew Kraus
Hey, kannst du mir helfen? Ich habe das gleiche Problem, aber mein Host ist ein Windows-Computer, auf dem ich versuche, meinen Docker-Container auszuführen und das Ubuntu-Image dort zu konfigurieren. Wenn Sie hier von Nameserver sprechen, bedeutet dies die DNS-Serveradresse meines Windows-Computers? Und wird es auch darin das primäre oder das sekundäre sein?
CodeHunter
Dies ist genau das Problem, mit dem ich konfrontiert war, als meine Organisation das öffentliche DNS blockierte und das DNS der Organisation in / etc / default / docker unter DOCKER_OPTS funktionierte und das Problem behoben wurde. Alle
begrüßen
7

Nachdem ich der Standard-Docker-Datei eine lokale DNS-IP hinzugefügt hatte, funktionierte sie für mich. Bitte finden Sie die folgenden Schritte ...

$ 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)

Jetzt mach weiter und baue den Docker ... :)

Prakash ND
quelle
7

Für alle, die dieses Problem ebenfalls haben, habe ich mein Problem durch Bearbeiten der /etc/default/dockerDatei gelöst , wie in anderen Antworten und Fragen vorgeschlagen. Ich hatte jedoch keine Ahnung, welche IP als DNS verwendet werden sollte.

Erst nach einer Weile stellte ich fest, dass ich ifconfig dockerauf dem Host ausgeführt werden musste, um die IP für die Docker-Netzwerkschnittstelle anzuzeigen.

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)

Es war 172.17.0.1in meinem Fall. Hoffe, das hilft jedem, der auch dieses Problem hat.

Vini.g.fer
quelle
7
Es wäre hilfreich, wenn Sie angeben würden, wie Sie Ihre Docker-Datei bearbeitet haben
physincubus
1
Unter Ubuntu 18.04:ifconfig docker0
automorph
6

Ich habe diese Antwort nach einigem Googleing gefunden. Ich verwende Windows, daher galten einige der oben genannten Antworten nicht für mein Dateisystem.

Grundsätzlich laufen:

docker-machine ssh default
echo "nameserver 8.8.8.8" > /etc/resolv.conf

Was den vorhandenen Nameserver, der mit verwendet wird, einfach überschreibt, 8.8.8.8glaube ich. Es hat bei mir funktioniert!

Aufgrund einiger Kommentare müssen Sie möglicherweise root sein. Um dies zu tun, geben Sie aus sudo -i.

Engineero
quelle
Dies hat bei mir unter Windows 10 nicht funktioniert, weil sshes nicht existiert?
Seanny123
@ Seanny123 Es ist schon eine Weile her, dass ich irgendetwas damit gemacht habe, aber ich war auch unter Windows 10. Möglicherweise habe ich zu diesem Zeitpunkt die ältere Docker Toolbox verwendet . Andernfalls müssen Sie möglicherweise den Windows SSH-Client aktivieren . Ich würde wahrscheinlich damit anfangen.
Engineero
1
dies war für mich, nachdem ich Wurzel wurde, das zu tun, Problem , sudo -iwenn Sie in sind
MediaVince
5

Ich wollte nur eine späte Antwort für alle hinzufügen, die auf dieses Problem von Suchmaschinen stoßen.

Tun Sie dies NICHT: Früher hatte ich eine Option in / etc / default / docker zum Festlegen iptables=false. Dies lag daran, dass ufw nicht funktionierte (alles wurde geöffnet, obwohl nur 3 Ports erlaubt waren), also folgte ich blind der Antwort auf diese Frage: Uncomplicated Firewall (UFW) blockiert nichts, wenn Docker verwendet wird, und dies wurde in der verknüpft Bemerkungen

Ich habe ein sehr geringes Verständnis der iptables-Regeln / nat / routing im Allgemeinen, weshalb ich möglicherweise etwas Irrationales getan habe.

Es stellt sich heraus, dass ich es wahrscheinlich falsch konfiguriert und die DNS-Auflösung in meinen Containern beendet habe. Als ich ein interaktives Containerterminal betrieb:docker run -i -t ubuntu:14.04 /bin/bash

Ich hatte diese Ergebnisse:

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

Durch das Zurücksetzen meiner gesamten ufw-Konfiguration (before.rules), das Deaktivieren von ufw und das Entfernen von iptables = false aus / etc / default / docker wurde die DNS-Auflösungsfunktionalität der Container wiederhergestellt.

Ich freue mich jetzt darauf, die ufw-Funktionalität wieder zu aktivieren, indem ich stattdessen diese Anweisungen befolge .

Heu
quelle
3

Ich habe das gleiche Problem und habe die genannten Schritte ausprobiert, aber anscheinend funktioniert keines, bis die Netzwerkeinstellungen aktualisiert wurden.

Die Schritte:

  1. Wie bereits erwähnt, hinzufügen DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true"zu /etc/default/docker.
  2. Leeren Sie den Inhalt der PREROUTING-Tabelle manuell mit iptables -t nat -F POSTROUTING. Starten Sie Docker anschließend neu und die nat-Tabelle wird mit dem neuen IP-Bereich initialisiert.
JQian
quelle
3

Gleiches Problem für mich (unter Ubuntu Xenial).

  • docker run --dns ... für Container gearbeitet.
  • Das Aktualisieren der Docker-Daemon-Optionen für docker build(Docker-Compose usw.) funktionierte nicht.

Nach der Analyse der Docker-Protokolle (journalctl -u docker.service ) wurde eine Warnung bezüglich einer fehlerhaften resolvconf angewendet.

Anschließend stellte ich fest, dass unsere Firmennamenserver zu den Netzwerkschnittstellen hinzugefügt wurden, jedoch nicht in resolvconf.

Diese Lösung angewendet Wie konfiguriere ich mein statisches DNS in Schnittstellen? (askubuntu) , dh Hinzufügen von Nameservern zu/etc/resolvconf/resolv.conf.d/tail

Nach dem Aktualisieren von resolvconf (oder Neustart).

bash docker run --rm busybox nslookup google.com

arbeitete sofort.

Alle meine Docker-Compose-Builds funktionieren jetzt.

mkoertgen
quelle
2

Ich habe heute das gleiche Problem, ich habe gerade die folgende Zeile zu / etc / default / docker hinzugefügt

DOCKER_OPTS="--dns 172.18.20.13 --dns 172.20.100.29 --dns 8.8.8.8"

und dann habe ich meinen Laptop neu gestartet.

In meinem Fall reicht es mir nicht aus, den Docker-Daemon neu zu starten. Ich muss meinen Laptop neu starten, damit er funktioniert.

Yusuf Ibrahim
quelle
2

Starten Sie Docker einfach neu und versuchen Sie es erneut, bevor Sie zu viel Zeit mit einer der anderen Lösungen verbringen .

Das Problem wurde für mich mit Docker Desktop für Windows unter Windows 10 behoben.

CGFoX
quelle
Ein Neustart mit Administratorrechten löste das Problem in meinem Fall.
Vene
1

Ich habe jetzt auch einige Zeit damit zu kämpfen, aber hier ist es, was es für mich gelöst hat Ubuntu 16.04 x64. Ich hoffe, es spart auch jemandem Zeit.

  1. In /etc/NetworkManager/NetworkManager.conf: auskommentieren #dns=dnsmasq

  2. Erstellen (oder ändern) /etc/docker/daemon.json:

{
    "dns": ["8.8.8.8"]
}
  1. Starten Sie Docker neu mit: sudo service docker restart
Palamunder
quelle
Scheint die gleiche Lösung zu sein wie stackoverflow.com/a/40516974/2308683
OneCricketeer
Eigentlich nicht. Das Update in NetworkManager.conf hat für meinen Fall einen Unterschied gemacht.
Palamunder
Ich bezweifle sehr, dass das systemweite Deaktivieren von dnsmasq die beste Lösung speziell für Docker
OneCricketeer
Ich teile mit, was für mich funktioniert hat, nachdem ich 2 Tage mit diesem Problem gekämpft habe.
Palamunder
Das hat bei mir nicht funktioniert
desmond13
0

Auf meinem System ( macOS High Sierra 10.13.6mit Docker 2.1.0.1) war dies auf einen Corporate Proxy zurückzuführen.

Ich habe dies in zwei Schritten gelöst:

  1. Konfigurieren Sie die Proxy-Einstellungen manuell in Preferences>Proxies
  2. Fügen Sie Ihrer config.json die gleichen Einstellungen hinzu ~/.docker/config.jsonwie:

     "proxies":
    {
      "default":
      {
        "httpProxy": "MYPROXY",
        "httpsProxy": "MYPROXY",
        "noProxy": "MYPROXYWHITELIST"
      }
    }
    
gustavz
quelle