Kompilacja Dockera „Nie można rozwiązać problemu„ archive.ubuntu.com ”” apt-get niczego nie instaluje

101

Próbowałem uruchomić kompilację Dockera na różnych plikach, które wcześniej działały, a teraz już nie działają.

Gdy tylko plik Dockera zawierał jakąkolwiek linię, która miała zainstalować oprogramowanie, zakończyła się niepowodzeniem z komunikatem informującym, że pakiet nie został znaleziony.

RUN apt-get -y install supervisor nodejs npm

Typowy komunikat, który pojawiał się w dziennikach, brzmiał

Could not resolve 'archive.ubuntu.com'

Masz jakiś pomysł, dlaczego nie można zainstalować żadnego oprogramowania?

Matt Carrier
źródło
stanie się tak, gdy maszyna zostanie odłączona od sieci ... Widziałem, że dzieje się tak na laptopie z systemem Linux z nową instalacją dockera, jeśli tylko newgrp dockerwydam zamiast robić pełne wylogowanie, a następnie zaloguj się po podaniu sobie sudo usermod -aG docker myuserid... jest to wyjątkowa sprawa dla pewnie jednak tak się dzieje
Scott Stensland

Odpowiedzi:

250

Odkomentowanie DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"w /etc/default/dockerjak Matt Przewoźnik zaproponował zrobił nie dla mnie. Ani też umieszczenie serwerów DNS mojej firmy w tym pliku. Ale jest inny sposób (czytaj dalej).

Najpierw zweryfikujmy problem:

$ 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

Jeśli wydaje się, że polecenie się zawiesiło, ale w końcu wypluwa błąd „nie można rozwiązać adresu„ google.com ””, oznacza to, że masz ten sam problem co ja.

nslookupKomenda wysyła zapytanie do serwera DNS 8.8.8.8 w celu przekształcenia adresu tekst „google.com” na adres IP. Jak na ironię, 8.8.8.8 to publiczny serwer DNS Google . Jeśli nslookupzawiedzie, publiczne serwery DNS, takie jak 8.8.8.8, mogą zostać zablokowane przez twoją firmę (co, jak zakładam, jest ze względów bezpieczeństwa).

Można by pomyśleć, że dodanie serwerów DNS Twojej firmy do DOCKER_OPTSin /etc/default/dockerpowinno załatwić sprawę, ale z jakiegoś powodu nie zadziałało. Poniżej opiszę, co zadziałało.

ROZWIĄZANIE :

Na hoście (używam Ubuntu 16.04) znajdź podstawowy i pomocniczy adres serwera DNS:

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

Korzystając z tych adresów, utwórz plik /etc/docker/daemon.json:

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

Umieść to w /etc/docker/daemon.json:

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

Wyjdź z roota:

# exit

Teraz zrestartuj docker:

$ sudo service docker restart

WERYFIKACJA :

Teraz sprawdź, czy dodanie /etc/docker/daemon.jsonpliku umożliwia przekształcenie „google.com” w adres 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

ODNIESIENIA :

Swoje rozwiązanie oparłem na artykule Robina Winslowa, któremu należy się pochwała za to rozwiązanie. Dzięki, Robin!

„Napraw konfigurację DNS sieci Docker”. Robin Winslow. Źródło 2016-11-09. https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/

Matthew Kraus
źródło
3
Otrzymałem błąd, że po zmianach nie można uruchomić usługi. To dlatego, że zmodyfikowałem DOCKER_OPTS w / etc / default / docker i /etc/init.d/docker. Cofnięcie zmian rozwiązało problem z uruchamianiem usługi
docker
7
To zadziałało dla mnie (w sieci firmowej), podczas gdy przyjęte rozwiązanie nie.
David Ebbo,
1
U mnie to też zadziałało, podczas gdy przyjęte rozwiązanie nie. Użyłem nslookup, aby uzyskać adres IP mojego serwera DNS, ale nie nmcli.
Necro
2
daemon.json też działa dla mnie! I możesz sprawdzić, czy twoja firma zablokowała 8.8.8.8 tym poleceniem nslookup google.com 8.8.8.8W moim przypadku tak jest, więc mam ten błądconnection timed out; no servers could be reached
ROTOGG
3
Myślę, że powód /etc/default/dockernie zadziałał u niektórych osób (cytując komentarz z pliku)# THIS FILE DOES NOT APPLY TO SYSTEMD
Jakub Bochenski
88

Po wielu bólach głowy znalazłem odpowiedź. Could not resolve 'archive.ubuntu.com'można naprawić, wprowadzając następujące zmiany:

  1. Odkomentuj następujący wiersz /etc/default/docker
    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

  2. Uruchom ponownie usługę Docker sudo service docker restart

  3. Usuń wszystkie obrazy, które zapisały w pamięci podręcznej nieprawidłowe ustawienia DNS.

  4. Zbuduj ponownie, a problem powinien zostać rozwiązany.

Kredyt należy do Andrew SB

Matt Carrier
źródło
7
możesz również dodać --no-cache = true, jeśli wolisz nie robić # 3 powyżej
jschorr
8
To nie działa dla mnie i nie mam pojęcia, dlaczego. Walczę z tym z przerwami od tygodni.
Corey Ogburn
2
Używam linux mint, więc nie ma boot2dockera. / etc / default / docker jest tworzony i ma powyżej flagę DOCKER_OPTS. Zrestartowałem usługę, wyczyściłem wszystkie obrazy i kontenery, ale nadal nic.
Corey Ogburn,
2
@CoreyOgburn Chciałbym również wypróbować --no-cache = true, jak wspomniano powyżej przez jschorr. np .:docker build --no-cache=true ...
Matt Carrier,
6
Pobiegłem, docker build --no-cache=true -t docker-whale .ale nic innego się nie wydarzyło.
Corey Ogburn,
47

Napotykam ten sam problem, ale nie pomaga mi odkomentowywanie wpisów / etc / default / docker dns, edytowanie /etc/resolv.conf w kontenerze kompilacji lub /etc/docker/daemon.json .

Ale po skompilowaniu z opcją --network = host rozwiązanie znów było w porządku.

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

Może to znowu komuś pomoże.

Gerald Hansen
źródło
Od dłuższego czasu pojawia się inny błąd „Nie można połączyć się z archive.ubuntu.com:80 (xxxx). - connect (111: Connection refused)” i stwierdziłem, że użycie opcji --network = host zostało już naprawione mój problem
Eric Arseneau
Po wielu rozwiązywaniu problemów jest to jedyna rzecz, która działała dla mnie.
math0ne
15

Uważam, że odpowiedź Matta Carriera jest właściwym rozwiązaniem tego problemu. Jednak po jego wdrożeniu nadal obserwowałem to samo zachowanie:could not resolve 'archive.ubuntu.com' .

Doprowadziło mnie to w końcu do stwierdzenia, że ​​sieć, z którą byłem połączony, blokowała publiczny DNS. Rozwiązaniem tego problemu było skonfigurowanie mojego kontenera Docker tak, aby używał tego samego serwera nazw, z którego korzystał mój host (maszyna, z której uruchomiłem Docker).

Jak triaged:

  1. Ponieważ pracowałem nad dokumentacją Dockera, na moim komputerze był już zainstalowany przykładowy obraz. Udało mi się uruchomić nowy kontener, aby uruchomić ten obraz i utworzyć nową sesję bash w tym kontenerze:docker run -it docker/whalesay bash
  2. Czy kontener ma połączenie z Internetem ?: ping 172.217.4.238 (google.com)
  3. Czy kontener może rozpoznawać nazwy hostów? ping google.com

W moim przypadku pierwsza pingzaowocowała odpowiedziami, druga nie.

Jak naprawiłem:

Kiedy odkryłem, że DNS nie działa w kontenerze, zweryfikowałem, że mogę skopiować to samo zachowanie na hoście. nslookup google.comrozwiązane dobrze na hoście. Ale nslookup google.com 8.8.8.8czynsloookup google.com 8.8.4.4 przekroczono limit czasu.

Następnie znalazłem serwery nazw, których używał mój host, uruchamiając nm-tool(na Ubuntu 14.04). W stylu szybkiej informacji zwrotnej, zacząłem się przykładowy obraz ponownie i dodaje adres IP serwera nazw do pliku resolv.conf kontenera: sudo vi /etc/resolv.conf. Po zapisaniu ponownie spróbowałem ping (ping google.com ) i tym razem zadziałało!

Należy pamiętać, że zmiany wprowadzone w resolv.conf kontenera nie są trwałe i zostaną utracone po ponownym uruchomieniu kontenera. W moim przypadku bardziej odpowiednim rozwiązaniem było dodanie adresu IP serwera nazw mojej sieci do /etc/default/dockerpliku hosta .

TMcManemy
źródło
2
Konkretne polecenia pobierania adresów serwerów nazw: nmcli device show <interfacename> | grep IP4.DNS(Ubuntu> = 15) i nmcli dev list iface <interfacename> | grep IP4(Ubuntu <15). Kredyt: Marty Fried .
r0estir0bbe
To jest bardziej obszerna odpowiedź. Zawsze mam problemy, gdy przełączam się do sieci biurowej lub gdy są zmiany w sieci. Dodanie serwera DNS firmy rozwiązuje problem z wyszukiwaniem.
gvd
1
Bardzo pouczające! Rzadko można znaleźć odpowiedzi, które pokazują, jak zweryfikować problem, a następnie zapewnić poprawkę (i sprawdzić, czy działa). Świetne rozwiązywanie problemów!
Matthew Kraus
Hej, czy możesz mi pomóc? Mam ten sam problem, ale mój host to komputer z systemem Windows, na którym próbuję uruchomić mój kontener Docker i próbuję tam skonfigurować obraz Ubuntu. Kiedy mówisz tutaj o serwerze nazw, czy oznacza to adres serwera DNS na moim komputerze z systemem Windows? I w tym też, czy będzie to pierwotne, czy drugorzędne?
CodeHunter
Dokładnie taki problem napotkałem, gdy moja organizacja zablokowała publiczny DNS i ustawienie DNS organizacji w / etc / default / docker w DOCKER_OPTS działało i problem został rozwiązany. Wszyscy witają tę odpowiedź ...
skm
7

Po dodaniu lokalnego adresu IP dns do domyślnego pliku dockera zaczęło działać dla mnie ... znajdź poniższe kroki ...

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

Teraz idź dalej i zbuduj docker ... :)

Prakash ND
źródło
7

Dla każdego, kto również ma ten problem, rozwiązałem go, edytując plik /etc/default/docker plik, zgodnie z sugestiami innych odpowiedzi i pytań. Jednak nie miałem pojęcia, jakiego adresu IP użyć jako DNS.

Dopiero po chwili zorientowałem się, że muszę uruchomić ifconfig dockerna hoście, aby wyświetlić adres IP interfejsu sieciowego dockera.

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)

Tak było 172.17.0.1w moim przypadku. Mam nadzieję, że pomoże to każdemu, kto również ma ten problem.

Vini.g.fer
źródło
7
Byłoby pomocne, gdybyś określił sposób, w jaki edytowałeś swój plik
dockera
1
W Ubuntu 18.04:ifconfig docker0
automorphic
6

Znalazłem tę odpowiedź po pewnym wygooglowaniu. Używam systemu Windows, więc niektóre z powyższych odpowiedzi nie dotyczą mojego systemu plików.

Zasadniczo uruchom:

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

Który po prostu zastępuje istniejący serwer nazw używany z 8.8.8.8moim zdaniem. U mnie zadziałało!

Na podstawie niektórych komentarzy może być konieczne uprawnienia administratora. Aby to zrobić, wystaw sudo -i.

Engineero
źródło
To nie zadziałało dla mnie w systemie Windows 10, ponieważ sshnie istnieje?
Seanny123
@ Seanny123 Minęło trochę czasu, odkąd cokolwiek z tym zrobiłem, ale byłem też na Windows 10. Mogłem wtedy używać starszej wersji Docker Toolbox ? W przeciwnym razie może być konieczne włączenie klienta Windows SSH . Pewnie od tego bym zaczął.
Engineero
1
to zadziałało po tym, jak zostałem rootem, aby to zrobić, sudo -i
wyślij
5

Chciałem tylko dodać późną odpowiedź dla każdego, kto napotka ten problem z wyszukiwarek.

NIE rób tego: miałem opcję w / etc / default / docker do ustawienia iptables=false. Było tak, ponieważ ufw nie działał (wszystko było otwarte, mimo że tylko 3 porty były dozwolone), więc ślepo podążyłem za odpowiedzią na to pytanie: Nieskomplikowana zapora ogniowa (UFW) nie blokuje niczego podczas korzystania z Dockera i to, co zostało połączone w komentarze

Mam bardzo słabe zrozumienie reguł iptables / nat / routingu w ogóle, dlatego mogłem zrobić coś irracjonalnego.

Okazuje się, że prawdopodobnie źle go skonfigurowałem i zabiłem rozpoznawanie nazw DNS w moich kontenerach. Kiedy prowadziłem interaktywny terminal kontenerowy:docker run -i -t ubuntu:14.04 /bin/bash

Miałem takie wyniki:

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

Przywrócenie całej mojej konfiguracji ufw (before.rules), wyłączenie ufw i usunięcie iptables = false z / etc / default / docker przywróciło funkcjonalność rozpoznawania DNS kontenerów.

Nie mogę się teraz doczekać ponownego włączenia funkcji ufw, postępując zgodnie z tymi instrukcjami .

Siano
źródło
3

Mam ten sam problem i wypróbowałem wymienione kroki, ale wydaje się, że żadna nie działa, dopóki nie odświeżysz ustawień sieciowych.

Kroki:

  1. Jak wspomniano, dodaj DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true"do /etc/default/docker.
  2. Ręcznie przepłucz zawartość tabeli PREROUTING za pomocą iptables -t nat -F POSTROUTING. Po uruchomieniu tego zrestartuj docker i zainicjuje tabelę nat z nowym zakresem IP.
JQian
źródło
3

Dla mnie ten sam problem (na Ubuntu Xenial).

  • docker run --dns ... dla kontenerów pracował.
  • Aktualizacja opcji demona Dockera dla docker build(docker-compose itp.) Nie działa.

Po przeanalizowaniu docker logs ( journalctl -u docker.service), jeśli znalazłem ostrzeżenie o błędnym zastosowaniu resolvconf.

Następnie stwierdziłem, że nasze firmowe serwery nazw zostały dodane do interfejsów sieciowych, ale nie w resolvconf.

Zastosowałem to rozwiązanie Jak skonfigurować mój statyczny DNS w interfejsach? (askubuntu) , czyli dodawanie serwerów nazw do/etc/resolvconf/resolv.conf.d/tail

Po aktualizacji resolvconf (lub restarcie).

bash docker run --rm busybox nslookup google.com

działał natychmiast.

Wszystkie moje kompilacje docker-compose teraz działają.

mkoertgen
źródło
2

Mam dziś ten sam problem, właśnie dodałem wiersz poniżej do / etc / default / docker

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

a potem ponownie uruchomiłem laptopa.

W moim przypadku ponowne uruchomienie demona dockera nie wystarczy, muszę ponownie uruchomić laptopa, aby działał.

Yusuf Ibrahim
źródło
2

Zanim spędzisz zbyt dużo czasu na jakimkolwiek innym rozwiązaniu, po prostu uruchom ponownie Dockera i spróbuj ponownie.

Rozwiązałem problem, używając Docker Desktop dla Windows w systemie Windows 10.

CGFoX
źródło
Ponowne uruchomienie go z uprawnieniami administratora rozwiązało problem w moim przypadku.
żyła
2

Od jakiegoś czasu też się z tym zmagałem, ale tutaj właśnie to dla mnie rozwiązało Ubuntu 16.04 x64. Mam nadzieję, że to też oszczędza komuś czas.

  1. W /etc/NetworkManager/NetworkManager.conf: skomentuj #dns=dnsmasq

  2. Utwórz (lub zmodyfikuj) /etc/docker/daemon.json:

{
    "dns": ["8.8.8.8"]
}
  1. Uruchom ponownie okno dokowane za pomocą: sudo service docker restart
palamunder
źródło
Wydaje się, że jest to to samo rozwiązanie, co stackoverflow.com/a/40516974/2308683
OneCricketeer
Właściwie to nie. Poprawka w NetworkManager.conf zrobiła różnicę w moim przypadku.
palamunder
Bardzo wątpię, że wyłączenie dnsmasq w całym systemie jest najlepszym rozwiązaniem specjalnie dla
Dockera
Dzielę się tym, co u mnie zadziałało po 2 dniach walki z tym problemem.
palamunder
0

W moim systemie ( macOS High Sierra 10.13.6z Docker 2.1.0.1) było to spowodowane korporacyjnym proxy.

Rozwiązałem to w dwóch krokach:

  1. Ręcznie skonfiguruj ustawienia proxy w Preferences>Proxies
  2. Dodaj te same ustawienia do pliku config.json w środku, na ~/.docker/config.jsonprzykład:

     "proxies":
    {
      "default":
      {
        "httpProxy": "MYPROXY",
        "httpsProxy": "MYPROXY",
        "noProxy": "MYPROXYWHITELIST"
      }
    }
    
gustavz
źródło