Docker build "Impossibile risolvere 'archive.ubuntu.com'" apt-get non installa nulla


101

Ho provato a eseguire Docker build su vari file che in precedenza funzionavano, che ora non funzionano più.

Non appena il file Docker includeva una riga che doveva installare il software, falliva con un messaggio che diceva che il pacchetto non è stato trovato.

RUN apt-get -y install supervisor nodejs npm

Il messaggio comune che appariva nei log era

Could not resolve 'archive.ubuntu.com'

Qualche idea sul perché nessun software non verrà installato?


questo accadrà quando la macchina viene disconnessa dalla rete ... ho visto che accade su laptop Linux con una nuova installazione docker se emetto solo newgrp dockerinvece di eseguire un log completo, quindi accedi dopo aver dato me stesso sudo usermod -aG docker myuserid... è un caso limite per certo comunque che accada
Scott Stensland il

Risposte:


250

Decommentando DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"a /etc/default/dockercome Matt Carrier ha suggerito ha NON funzionato per me. Né ha messo i server DNS della mia azienda in quel file. Ma c'è un altro modo (continua a leggere).

Innanzitutto, verifichiamo il problema:

$ 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

Se il comando sembra bloccarsi, ma alla fine viene visualizzato l'errore "Impossibile risolvere 'google.com'", hai lo stesso problema che ho io.

Il nslookupcomando interroga il server DNS 8.8.8.8 per trasformare l'indirizzo di testo di "google.com" in un indirizzo IP. Ironia della sorte, 8.8.8.8 è il server DNS pubblico di Google . Se nslookupfallisce, i server DNS pubblici come 8.8.8.8 potrebbero essere bloccati dalla tua azienda (che presumo sia per motivi di sicurezza).

Penseresti che aggiungere i server DNS della tua azienda a DOCKER_OPTSin /etc/default/dockerdovrebbe fare il trucco, ma per qualsiasi motivo, non ha funzionato per me. Descrivo di seguito cosa ha funzionato per me.

SOLUZIONE :

Sull'host (sto usando Ubuntu 16.04), trova gli indirizzi del server DNS primario e secondario:

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

Utilizzando questi indirizzi, crea un file /etc/docker/daemon.json:

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

Metti questo in /etc/docker/daemon.json:

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

Esci dalla radice:

# exit

Ora riavvia docker:

$ sudo service docker restart

VERIFICA :

Ora verifica che l'aggiunta del /etc/docker/daemon.jsonfile ti consenta di risolvere "google.com" in un indirizzo IP:

$ 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

RIFERIMENTI :

Ho basato la mia soluzione su un articolo di Robin Winslow, che merita tutto il merito per la soluzione. Grazie, Robin!

"Risolvi la configurazione del DNS di rete di Docker." Robin Winslow. Estratto 2016/11/09. https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/


3
Ho ricevuto un errore, che il servizio non può essere avviato dopo le modifiche. Questo perché ho modificato DOCKER_OPTS in / etc / default / docker e /etc/init.d/docker. Il ripristino delle modifiche ha risolto il problema di avvio del servizio
Docker

7
Questo ha funzionato per me (su una rete aziendale) mentre la soluzione accettata no.
David Ebbo

1
Questo ha funzionato anche per me, mentre la soluzione accettata no. Ho usato nslookup per ottenere l'IP del mio server DNS anche se non nmcli.
Necro

2
daemon.json funziona anche per me! E puoi verificare se la tua azienda ha bloccato 8.8.8.8 da questo comando nslookup google.com 8.8.8.8Nel mio caso è così ho ricevuto questo erroreconnection timed out; no servers could be reached
ROTOGG

3
Penso che il motivo /etc/default/dockernon abbia funzionato per alcune persone è (citando un commento dal file)# THIS FILE DOES NOT APPLY TO SYSTEMD
Jakub Bochenski

88

Dopo tanto mal di testa ho trovato la risposta. Could not resolve 'archive.ubuntu.com'può essere risolto apportando le seguenti modifiche:

  1. Rimuovere il commento dalla riga seguente /etc/default/docker
    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

  2. Riavvia il servizio Docker sudo service docker restart

  3. Elimina tutte le immagini che hanno memorizzato nella cache le impostazioni DNS non valide.

  4. Ricostruisci e il problema dovrebbe essere risolto.

Il merito va ad Andrew SB


7
puoi anche aggiungere --no-cache = true se preferisci non fare # 3 sopra
jschorr

8
Questo non funziona per me e non ho idea del perché. Ho combattuto questa cosa a intermittenza per settimane.
Corey Ogburn

2
Sto funzionando su Linux Mint quindi non c'è boot2docker. / etc / default / docker viene creato e ha il flag DOCKER_OPTS sopra. Ho riavviato il servizio, cancellato tutte le immagini e i contenitori ma ancora niente.
Corey Ogburn

2
@CoreyOgburn proverei anche --no-cache = true come menzionato sopra da jschorr. es:docker build --no-cache=true ...
Matt Carrier

6
Ho corso docker build --no-cache=true -t docker-whale .ma sembra che non sia successo niente di diverso.
Corey Ogburn

46

Mi imbatto nello stesso problema, ma neiter la rimozione dei commenti / etc / default / docker dns, né la modifica di /etc/resolv.conf nel contenitore di build o di /etc/docker/daemon.json mi aiuta.

Ma dopo aver compilato con l'opzione --network = host la risoluzione è andata di nuovo bene.

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

Forse questo aiuterà di nuovo qualcuno.


Ho ricevuto un errore diverso da molto tempo "Impossibile connettersi a archive.ubuntu.com:80 (xxxx). - connect (111: Connessione rifiutata)" e ho scoperto che l'utilizzo di --network = host è stato risolto il mio problema
Eric Arseneau

Dopo tonnellate di risoluzione dei problemi, questa è l'unica cosa che ha funzionato per me.
math0ne

15

Credo che la risposta di Matt Carrier sia la soluzione corretta per questo problema. Tuttavia, dopo l'implementazione, ho ancora osservato lo stesso comportamento: could not resolve 'archive.ubuntu.com'.

Questo mi ha portato alla fine a scoprire che la rete a cui ero connesso stava bloccando il DNS pubblico. La soluzione a questo problema era configurare il mio contenitore Docker per utilizzare lo stesso server dei nomi che utilizzava il mio host (la macchina da cui stavo eseguendo Docker).

Come ho triage:

  1. Dato che stavo lavorando alla documentazione di Docker, avevo già un'immagine di esempio installata sulla mia macchina. Sono stato in grado di avviare un nuovo contenitore per eseguire quell'immagine e creare una nuova sessione bash in quel contenitore:docker run -it docker/whalesay bash
  2. Il contenitore dispone di una connessione Internet ?: ping 172.217.4.238(google.com)
  3. Il contenitore può risolvere i nomi host? ping google.com

Nel mio caso, la prima ha pingprodotto risposte, la seconda no.

Come ho risolto:

Una volta scoperto che il DNS non funzionava all'interno del container, ho verificato che potevo duplicare lo stesso comportamento sull'host. nslookup google.comrisolto benissimo sull'host. Ma nslookup google.com 8.8.8.8o nsloookup google.com 8.8.4.4scaduto.

Successivamente, ho trovato i server dei nomi che il mio host stava utilizzando eseguendo nm-tool(su Ubuntu 14.04). In vena di feedback rapido, ho iniziato l'immagine ad esempio ancora una volta, e ho aggiunto l'indirizzo IP del server dei nomi di file resolv.conf del contenitore: sudo vi /etc/resolv.conf. Una volta salvato, ho tentato di nuovo il ping ( ping google.com) e questa volta ha funzionato!

Si noti che le modifiche apportate al file resolv.conf del contenitore non sono persistenti e andranno perse al riavvio del contenitore. Nel mio caso, la soluzione più appropriata era aggiungere l'indirizzo IP del server dei nomi della mia rete al /etc/default/dockerfile dell'host .


2
Comandi concreti per ottenere gli indirizzi dei server dei nomi: nmcli device show <interfacename> | grep IP4.DNS(Ubuntu> = 15) e nmcli dev list iface <interfacename> | grep IP4(Ubuntu <15). Credito: Marty Fried .
r0estir0bbe

Questa è una risposta più ampia. Ho sempre problemi quando passo alla rete del mio ufficio o quando ci sono cambiamenti di rete. L'aggiunta del server DNS della tua azienda risolve il problema di ricerca.
gvd

1
Molto istruttivo! È raro trovare risposte che mostrino come verificare il problema, quindi fornire una soluzione (e verificare che la correzione funzioni). Grande risoluzione dei problemi!
Matthew Kraus

Ehi, puoi darmi una mano? Sto riscontrando lo stesso problema ma il mio host è una macchina Windows in cui sto provando a eseguire il mio contenitore Docker e provando a configurare l'immagine Ubuntu lì. Quando parli di server dei nomi qui, significa l'indirizzo del server DNS della mia macchina Windows? E anche in questo sarà quello primario o quello secondario?
CodeHunter

Questo è il problema esatto che ho dovuto affrontare quando la mia organizzazione ha bloccato il DNS pubblico e l'impostazione del DNS dell'organizzazione in / etc / default / docker in DOCKER_OPTS ha funzionato e il problema è stato risolto. Tutti salutano questa risposta ...
skm

7

Dopo aver aggiunto l'ip dns locale al file docker predefinito, ha iniziato a funzionare per me ... si prega di trovare i passaggi seguenti ...

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

Ora vai avanti e costruisci il docker ... :)


7

Per chiunque abbia anche questo problema, ho risolto il mio problema modificando il /etc/default/dockerfile, come suggerito da altre risposte e domande. Tuttavia non avevo idea di quale IP usare come DNS.

È stato solo dopo un po 'che ho capito che dovevo eseguire ifconfig dockersull'host per mostrare l'IP per l'interfaccia di rete docker.

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)

È stato 172.17.0.1nel mio caso. Spero che questo aiuti chiunque abbia anche questo problema.


7
Sarebbe utile se specificassi il modo in cui hai modificato il tuo file
Docker

1
Su Ubuntu 18.04:ifconfig docker0
automorfe

6

Ho trovato questa risposta dopo aver cercato su Google. Sto usando Windows, quindi alcune delle risposte precedenti non si applicano al mio file system.

Fondamentalmente esegui:

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

Che sovrascrive solo il server dei nomi esistente utilizzato con 8.8.8.8credo. Ha funzionato per me!

Sulla base di alcuni commenti, potresti dover essere root. Per farlo, emetti sudo -i.


Questo non ha funzionato per me su Windows 10, perché sshnon esiste?
Seanny123

@ Seanny123 è passato un po 'di tempo da quando ho fatto qualcosa con questo, ma ero anche su Windows 10. Potrei aver utilizzato il vecchio Docker Toolbox in quel momento? In caso contrario, potrebbe essere necessario abilitare il client SSH di Windows . Probabilmente inizierei con quello.
Engineero

1
questo ha funzionato per me dopo essere diventato root, per farlo, problema sudo -iuna volta
entrato

5

Volevo solo aggiungere una risposta in ritardo per chiunque si imbattesse in questo problema dai motori di ricerca.

NON farlo: avevo un'opzione in / etc / default / docker da impostare iptables=false. Questo perché ufw non funzionava (tutto è stato aperto anche se erano consentite solo 3 porte), quindi ho seguito ciecamente la risposta a questa domanda: Uncomplicated Firewall (UFW) non blocca nulla quando si utilizza Docker e questo, che era collegato nel Commenti

Ho una conoscenza molto bassa delle regole di iptables / nat / routing in generale, quindi perché avrei potuto fare qualcosa di irrazionale.

Si scopre che probabilmente l'ho configurato male e ho ucciso la risoluzione DNS all'interno dei miei contenitori. Quando ho eseguito un terminale per container interattivo:docker run -i -t ubuntu:14.04 /bin/bash

Ho avuto questi risultati:

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

Ripristinare tutta la mia configurazione ufw (before.rules), disabilitare ufw e rimuovere iptables = false da / etc / default / docker ha ripristinato la funzionalità di risoluzione DNS dei contenitori.

Non vedo l'ora di riattivare la funzionalità ufw seguendo invece queste istruzioni .


3

Ho lo stesso problema e ho provato i passaggi menzionati, ma sembra che nessuno funzioni fino a quando non aggiorno le impostazioni di rete.

I passi:

  1. Come accennato, aggiungi DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true"a /etc/default/docker.
  2. Lavare manualmente il contenuto della tabella PREROUTING utilizzando il file iptables -t nat -F POSTROUTING. Dopo aver eseguito questo, riavvia docker e inizializzerà la tabella nat con il nuovo intervallo IP.

3

Stesso problema per me (su Ubuntu Xenial).

  • docker run --dns ... per contenitori lavorati.
  • L'aggiornamento delle opzioni del demone docker per docker build(docker-compose ecc.) Non ha funzionato.

Dopo aver analizzato i log docker ( journalctl -u docker.service), se è stato trovato un avviso relativo a un errore resolvconf applicato.

In seguito ho scoperto che i nostri server dei nomi aziendali sono stati aggiunti alle interfacce di rete ma non in resolvconf.

Applicato questa soluzione Come configuro il mio DNS statico nelle interfacce? (askubuntu) , ovvero l'aggiunta di server dei nomi a/etc/resolvconf/resolv.conf.d/tail

Dopo aver aggiornato resolvconf (o riavviare).

bash docker run --rm busybox nslookup google.com

ha funzionato immediatamente.

Tutte le mie build docker-compose funzionano ora.


2

Oggi ho avuto lo stesso problema, ho appena aggiunto la riga sotto a / etc / default / docker

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

e poi ho riavviato il mio laptop.

Nel mio caso il riavvio del demone docker non è sufficiente per me, devo riavviare il mio laptop per farlo funzionare.


2

Prima di dedicare troppo tempo a qualsiasi altra soluzione, riavvia semplicemente Docker e riprova.

Ho risolto il problema per me, utilizzando Docker Desktop per Windows su Windows 10.


Il riavvio con i diritti di amministratore ha risolto il problema nel mio caso.
vena

1

Ho lottato per un po 'di tempo anche con questo, ma ecco cosa mi ha risolto Ubuntu 16.04 x64. Spero anche che faccia risparmiare tempo a qualcuno.

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

  2. Crea (o modifica) /etc/docker/daemon.json:

{
    "dns": ["8.8.8.8"]
}
  1. Riavvia docker con: sudo service docker restart

Sembra essere stessa soluzione stackoverflow.com/a/40516974/2308683
OneCricketeer

In realtà no. La correzione in NetworkManager.conf ha fatto la differenza per il mio caso.
palamunder

Dubito fortemente che disabilitare il sistema dnsmasq sia la migliore soluzione specifica per Docker
OneCricketeer

Condivido ciò che ha funzionato per me dopo aver combattuto 2 giorni con questo problema.
palamunder

Questo non ha funzionato per me
desmond13

0

Sul mio sistema ( macOS High Sierra 10.13.6con Docker 2.1.0.1) ciò era dovuto a un proxy aziendale.

L'ho risolto in due passaggi:

  1. Configura manualmente le impostazioni del proxy in Preferences>Proxies
  2. Aggiungi le stesse impostazioni al tuo config.json all'interno ~/.docker/config.jsoncome:

     "proxies":
    {
      "default":
      {
        "httpProxy": "MYPROXY",
        "httpsProxy": "MYPROXY",
        "noProxy": "MYPROXYWHITELIST"
      }
    }
    
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.