Docker build "Tidak dapat menyelesaikan 'archive.ubuntu.com'" apt-get gagal menginstal apa pun

101

Saya sudah mencoba menjalankan Docker build pada berbagai file yang sebelumnya berfungsi sebelumnya, yang sekarang tidak lagi berfungsi.

Segera setelah file Docker menyertakan baris apa pun yang akan menginstal perangkat lunak, itu akan gagal dengan pesan yang mengatakan bahwa paket tersebut tidak ditemukan.

RUN apt-get -y install supervisor nodejs npm

Pesan umum yang muncul di log adalah

Could not resolve 'archive.ubuntu.com'

Tahu mengapa perangkat lunak tidak dapat diinstal?

Matt Carrier
sumber
ini akan terjadi ketika mesin terputus dari internet ... Saya telah melihat itu terjadi pada laptop linux dengan instalasi buruh pelabuhan baru jika saya hanya mengeluarkan newgrp dockeralih-alih melakukan log off penuh kemudian masuk setelah memberikan diri saya sudo usermod -aG docker myuserid... itu kasus tepi untuk yakin bagaimanapun itu terjadi
Scott Stensland

Jawaban:

250

Uncommenting DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"di /etc/default/dockersebagai Matt Pembawa disarankan tidak TIDAK bekerja untuk saya. Juga tidak menempatkan server DNS perusahaan saya di file itu. Tapi, ada cara lain (baca terus).

Pertama, mari kita verifikasi masalahnya:

$ 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

Jika perintah tampaknya macet, tetapi pada akhirnya memunculkan kesalahan "tidak dapat menyelesaikan 'google.com'", Anda memiliki masalah yang sama dengan saya.

The nslookupperintah query DNS Server 8.8.8.8 untuk mengubah alamat teks 'google.com' ke alamat IP. Ironisnya, 8.8.8.8 adalah server DNS publik Google . Jika nslookupgagal, server DNS publik seperti 8.8.8.8 mungkin diblokir oleh perusahaan Anda (yang saya asumsikan karena alasan keamanan).

Anda akan berpikir bahwa menambahkan server DNS perusahaan Anda ke DOCKER_OPTSdalam /etc/default/dockerharus melakukan trik, tetapi untuk alasan apa pun, itu tidak berhasil untuk saya. Saya menjelaskan apa yang berhasil untuk saya di bawah ini.

SOLUSI :

Di host (saya menggunakan Ubuntu 16.04), cari tahu alamat server DNS primer dan sekunder:

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

Menggunakan alamat ini, buat file /etc/docker/daemon.json:

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

Taruh ini di /etc/docker/daemon.json:

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

Keluar dari root:

# exit

Sekarang restart buruh pelabuhan:

$ sudo service docker restart

VERIFIKASI :

Sekarang periksa apakah menambahkan /etc/docker/daemon.jsonfile memungkinkan Anda menyelesaikan 'google.com' menjadi alamat 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

REFERENSI :

Saya mendasarkan solusi saya pada artikel oleh Robin Winslow, yang berhak mendapatkan semua pujian atas solusinya. Terima kasih, Robin!

"Perbaiki konfigurasi DNS jaringan Docker." Robin Winslow. Diakses tanggal 09 September 2016. https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/

Matthew Kraus
sumber
3
Saya menerima kesalahan, bahwa layanan tidak dapat dimulai setelah perubahan. Ini karena saya memodifikasi DOCKER_OPTS di / etc / default / docker dan /etc/init.d/docker. Mengembalikan perubahan menyelesaikan masalah startup dari layanan buruh pelabuhan
Twiebie
7
Ini berhasil untuk saya (di jaringan perusahaan) sementara solusi yang diterima tidak.
David Ebbo
1
Ini berhasil untuk saya juga sementara solusi yang diterima tidak. Saya menggunakan nslookup untuk mendapatkan IP server DNS saya meskipun bukan nmcli.
Necro
2
daemon.json bekerja untuk saya juga! Dan Anda dapat memeriksa apakah perusahaan Anda telah memblokir 8.8.8.8 dengan perintah ini nslookup google.com 8.8.8.8Dalam kasus saya, saya mendapat kesalahan iniconnection timed out; no servers could be reached
ROTOGG
3
Saya pikir alasannya /etc/default/dockertidak berhasil bagi sebagian orang adalah (mengutip komentar dari file)# THIS FILE DOES NOT APPLY TO SYSTEMD
Jakub Bochenski
88

Setelah banyak pusing saya menemukan jawabannya. Could not resolve 'archive.ubuntu.com'dapat diperbaiki dengan melakukan perubahan berikut:

  1. Batalkan komentar pada baris berikut /etc/default/docker
    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

  2. Mulai ulang layanan Docker sudo service docker restart

  3. Hapus semua gambar yang memiliki cache pengaturan DNS yang tidak valid.

  4. Bangun lagi dan masalahnya harus diselesaikan.

Penghargaan diberikan kepada Andrew SB

Matt Carrier
sumber
7
Anda juga dapat menambahkan --no-cache = true jika Anda lebih suka tidak melakukan # 3 di atas
jschorr
8
Ini tidak berhasil untuk saya dan saya tidak tahu mengapa. Saya telah melawan ini selama berminggu-minggu.
Corey Ogburn
2
Saya menggunakan linux mint jadi tidak ada boot2docker. / etc / default / docker dibuat dan memiliki flag DOCKER_OPTS di atas. Saya telah memulai ulang layanan, menghapus semua gambar dan kontainer tetapi masih tidak ada.
Corey Ogburn
2
@CoreyOgburn Saya juga akan mencoba --no-cache = true seperti yang disebutkan di atas oleh jschorr. mis .:docker build --no-cache=true ...
Matt Carrier
6
Aku lari docker build --no-cache=true -t docker-whale .tapi sepertinya tidak ada perbedaan yang terjadi.
Corey Ogburn
46

Saya mengalami masalah yang sama, tetapi entri yang tidak mengomentari / etc / default / docker dns atau mengedit /etc/resolv.conf di build container atau /etc/docker/daemon.json membantu saya.

Tetapi setelah saya membangun dengan opsi --network = host, penyelesaiannya baik-baik saja.

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

Mungkin ini akan membantu seseorang lagi.

Gerald Hansen
sumber
Saya telah mendapatkan kesalahan yang berbeda untuk waktu yang lama "Tidak dapat terhubung ke archive.ubuntu.com:80 (xxxx). - hubungkan (111: Sambungan ditolak)" dan menemukan bahwa menggunakan host --network = sekarang telah diperbaiki masalah saya
Eric Arseneau
Setelah banyak pemecahan masalah, ini adalah satu-satunya hal yang berhasil untuk saya.
math0ne
15

Saya percaya bahwa jawaban Matt Carrier adalah solusi yang tepat untuk masalah ini. Namun, setelah menerapkan itu, saya masih mengamati perilaku yang sama: could not resolve 'archive.ubuntu.com'.

Hal ini membuat saya akhirnya menemukan bahwa jaringan tempat saya terhubung memblokir DNS publik. Solusi untuk masalah ini adalah mengonfigurasi container Docker saya untuk menggunakan server nama yang sama dengan yang digunakan host saya (mesin tempat saya menjalankan Docker).

Bagaimana saya melakukan triase:

  1. Sejak saya mengerjakan dokumentasi Docker, saya sudah menginstal gambar contoh di mesin saya. Saya bisa memulai penampung baru untuk menjalankan gambar itu dan membuat sesi bash baru di penampung itu:docker run -it docker/whalesay bash
  2. Apakah penampung memiliki koneksi internet ?: ping 172.217.4.238(google.com)
  3. Dapatkah penampung menyelesaikan nama host? ping google.com

Dalam kasus saya, yang pertama pingmenghasilkan tanggapan, yang kedua tidak.

Bagaimana saya memperbaiki:

Setelah saya menemukan bahwa DNS tidak berfungsi di dalam penampung, saya memverifikasi bahwa saya dapat menduplikasi perilaku yang sama pada host. nslookup google.comdiselesaikan dengan baik pada tuan rumah. Tapi, nslookup google.com 8.8.8.8atau nsloookup google.com 8.8.4.4waktu habis.

Selanjutnya, saya menemukan server nama yang digunakan host saya dengan menjalankan nm-tool(di Ubuntu 14.04). Dalam vena dari umpan balik yang cepat, aku mulai menaiki contoh gambar lagi, dan menambahkan alamat IP dari server nama file resolv.conf wadah ini: sudo vi /etc/resolv.conf. Setelah disimpan, saya mencoba melakukan ping lagi ( ping google.com) dan kali ini berhasil!

Harap diperhatikan bahwa perubahan yang dibuat pada resolv.conf penampung tidak terus-menerus dan akan hilang saat penampung dimulai ulang. Dalam kasus saya, solusi yang lebih tepat adalah menambahkan alamat IP server nama jaringan saya ke file host /etc/default/docker.

TMcManemy
sumber
2
Perintah konkret untuk mendapatkan server nama alamat: nmcli device show <interfacename> | grep IP4.DNS(Ubuntu> = 15) dan nmcli dev list iface <interfacename> | grep IP4(Ubuntu <15). Kredit: Marty Fried .
r0estir0bbe
Ini adalah jawaban yang lebih luas. Saya selalu mengalami masalah ketika saya beralih ke jaringan kantor saya atau ketika ada perubahan jaringan. Menambahkan server DNS perusahaan Anda akan memperbaiki masalah pencarian.
DVD
1
Sangat instruksional! Sangat jarang menemukan jawaban yang menunjukkan kepada Anda cara memverifikasi masalah, lalu memberikan perbaikan (dan memverifikasi perbaikan berfungsi). Pemecahan masalah yang bagus!
Matthew Kraus
Hei, bisakah kamu membantuku? Saya mengalami masalah yang sama tetapi host saya adalah mesin windows tempat saya mencoba menjalankan kontainer buruh pelabuhan saya dan mencoba mengkonfigurasi image Ubuntu di sana. Ketika Anda berbicara tentang server nama di sini, apakah itu berarti alamat server DNS mesin windows saya? Dan dalam hal itu juga, apakah itu yang utama atau yang kedua?
CodeHunter
Ini adalah masalah sebenarnya yang saya hadapi ketika organisasi saya memblokir DNS publik dan mengatur DNS organisasi di / etc / default / docker di bawah DOCKER_OPTS berfungsi dan masalah diselesaikan. Semua memuji jawaban ini ...
skm
7

Setelah menambahkan ip dns lokal ke file buruh pelabuhan default itu mulai berfungsi untuk saya ... silakan temukan langkah-langkah di bawah ini ...

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

Sekarang lanjutkan dan bangun buruh pelabuhan ... :)

Prakash ND
sumber
7

Bagi siapa pun yang juga mengalami masalah ini, saya menyelesaikan masalah saya dengan mengedit /etc/default/dockerfile, seperti yang disarankan oleh jawaban dan pertanyaan lain. Namun saya tidak tahu IP apa yang akan digunakan sebagai DNS.

Hanya setelah beberapa saat saya menemukan bahwa saya harus menjalankan ifconfig dockerhost untuk menunjukkan IP untuk antarmuka jaringan buruh pelabuhan.

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)

Itu 172.17.0.1dalam kasus saya. Semoga ini bisa membantu siapa saja yang juga mengalami masalah ini.

Vini.g.fer
sumber
7
Akan sangat membantu jika Anda menentukan cara Anda mengedit file buruh pelabuhan Anda
physincubus
1
Di Ubuntu 18.04:ifconfig docker0
automorfik
6

Saya menemukan jawaban ini setelah beberapa Googleing. Saya menggunakan Windows, jadi beberapa jawaban di atas tidak berlaku untuk sistem file saya.

Pada dasarnya menjalankan:

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

Yang hanya menimpa server nama yang digunakan dengan 8.8.8.8saya percaya. Itu berhasil untuk saya!

Berdasarkan beberapa komentar, Anda mungkin harus menjadi root. Untuk melakukan itu, terbitkan sudo -i.

Engineero
sumber
Ini tidak berhasil untuk saya di Windows 10, karena sshtidak ada?
Seanny123
@ Seanny123 sudah lama sejak saya melakukan sesuatu dengan ini, tetapi saya juga menggunakan Windows 10. Saya mungkin telah menggunakan Docker Toolbox yang lebih lama saat itu? Jika tidak, Anda mungkin perlu mengaktifkan Klien SSH Windows . Saya mungkin akan mulai dengan itu.
Engineero
1
ini berhasil bagi saya setelah saya menjadi root, untuk melakukan itu, masalah sudo -isetelah Anda masuk
MediaVince
5

Saya hanya ingin menambahkan tanggapan terlambat untuk siapa pun yang menemukan masalah ini dari mesin telusur.

JANGAN lakukan ini: Saya biasanya memiliki opsi di / etc / default / docker untuk disetel iptables=false. Ini karena ufw tidak berfungsi (semuanya dibuka meskipun hanya 3 port yang diizinkan) jadi saya secara membabi buta mengikuti jawaban untuk pertanyaan ini: Uncomplicated Firewall (UFW) tidak memblokir apa pun saat menggunakan Docker dan ini, yang ditautkan di komentar

Saya memiliki pemahaman yang sangat rendah tentang aturan iptables / nat / routing secara umum, oleh karena itu mengapa saya mungkin melakukan sesuatu yang tidak rasional.

Ternyata saya mungkin salah mengonfigurasinya dan mematikan resolusi DNS di dalam penampung saya. Ketika saya menjalankan terminal kontainer interaktif:docker run -i -t ubuntu:14.04 /bin/bash

Saya mendapatkan hasil ini:

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

Mengembalikan semua konfigurasi ufw saya (before.rules), menonaktifkan ufw dan menghapus iptables = false dari / etc / default / docker memulihkan fungsionalitas resolusi DNS dari wadah.

Sekarang saya tidak sabar untuk mengaktifkan kembali fungsi ufw dengan mengikuti petunjuk ini .

Jerami
sumber
3

Saya memiliki masalah yang sama, dan mencoba langkah-langkah yang disebutkan, tetapi tampaknya tidak ada yang berfungsi sampai menyegarkan pengaturan jaringan.

Langkah langkah:

  1. Seperti yang disebutkan, tambahkan DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true"ke /etc/default/docker.
  2. Bilas isi tabel PREROUTING secara manual menggunakan iptables -t nat -F POSTROUTING. Setelah menjalankan ini, restart buruh pelabuhan dan itu akan menginisialisasi tabel nat dengan rentang IP baru.
JQian
sumber
3

Masalah yang sama untuk saya (di Ubuntu Xenial).

  • docker run --dns ... untuk kontainer bekerja.
  • Memperbarui opsi daemon buruh pelabuhan untuk docker build(pembuatan pelabuhan dll.) Tidak berhasil.

Setelah menganalisis log buruh pelabuhan ( journalctl -u docker.service) jika ditemukan beberapa peringatan tentang resolvconf buruk diterapkan.

Setelah itu saya menemukan bahwa nameserver perusahaan kami ditambahkan ke antarmuka jaringan tetapi tidak di resolvconf.

Menerapkan solusi ini Bagaimana cara mengkonfigurasi DNS statis saya di antarmuka? (askubuntu) , yaitu menambahkan server nama ke/etc/resolvconf/resolv.conf.d/tail

Setelah memperbarui resolvconf (atau reboot).

bash docker run --rm busybox nslookup google.com

bekerja secara instan.

Semua build docker-compose saya berfungsi sekarang.

mkoertgen.dll
sumber
2

Saya mendapat masalah yang sama hari ini, saya baru saja menambahkan baris di bawah ini ke / etc / default / docker

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

dan kemudian saya me-restart Laptop saya.

Dalam kasus saya me-restart daemon docker tidak cukup bagi saya, saya harus me-restart Laptop saya untuk membuatnya berfungsi.

Yusuf Ibrahim
sumber
2

Sebelum menghabiskan terlalu banyak waktu untuk solusi lainnya, cukup restart Docker dan coba lagi.

Memecahkan masalah untuk saya, menggunakan Docker Desktop untuk Windows di Windows 10.

CGFoX
sumber
Memulai ulang dengan hak admin memecahkan masalah dalam kasus saya.
vena
1

Saya telah berjuang untuk beberapa waktu dengan ini sekarang juga, tetapi inilah yang memecahkannya untuk saya Ubuntu 16.04 x64. Saya harap ini juga menghemat waktu seseorang.

  1. Masuk /etc/NetworkManager/NetworkManager.conf: beri komentar #dns=dnsmasq

  2. Buat (atau modifikasi) /etc/docker/daemon.json:

{
    "dns": ["8.8.8.8"]
}
  1. Mulai ulang buruh pelabuhan dengan: sudo service docker restart
bencana
sumber
Tampaknya solusi yang sama seperti stackoverflow.com/a/40516974/2308683
OneCricketeer
Sebenarnya tidak. Perbaikan di NetworkManager.conf membuat perbedaan untuk kasus saya.
bencana
Saya sangat meragukan menonaktifkan sistem dnsmasq secara luas adalah solusi terbaik khusus untuk Docker
OneCricketeer
Saya berbagi apa yang berhasil untuk saya setelah berjuang 2 hari dengan masalah ini.
bencana
Ini tidak berhasil untuk saya
desmond13
0

Di sistem saya ( macOS High Sierra 10.13.6dengan Docker 2.1.0.1) ini karena proxy perusahaan.

Saya menyelesaikan ini dengan dua langkah:

  1. Konfigurasikan pengaturan proxy secara manual di Preferences>Proxies
  2. Tambahkan pengaturan yang sama ke config.json Anda di dalam ~/.docker/config.jsonseperti:

     "proxies":
    {
      "default":
      {
        "httpProxy": "MYPROXY",
        "httpsProxy": "MYPROXY",
        "noProxy": "MYPROXYWHITELIST"
      }
    }
    
gustavz.dll
sumber