Docker build “Không thể giải quyết 'archive.ubuntu.com'" apt-get không cài đặt được bất kỳ thứ gì


101

Tôi đã cố gắng chạy bản dựng Docker trên các tệp khác nhau trước đây hoạt động, giờ không còn hoạt động nữa.

Ngay sau khi tệp Docker bao gồm bất kỳ dòng nào để cài đặt phần mềm, nó sẽ không thành công với thông báo rằng không tìm thấy gói.

RUN apt-get -y install supervisor nodejs npm

Thông báo phổ biến hiển thị trong nhật ký là

Could not resolve 'archive.ubuntu.com'

Bất kỳ ý tưởng tại sao bất kỳ phần mềm sẽ không cài đặt?


điều này sẽ xảy ra khi máy bị ngắt kết nối mạng ... Tôi đã thấy điều đó xảy ra trên máy tính xách tay linux với cài đặt docker mới nếu tôi chỉ phát hành newgrp dockerthay vì thực hiện đăng nhập hoàn toàn rồi đăng nhập sau khi tự sudo usermod -aG docker myuserid... chắc chắn tuy nhiên điều đó xảy ra
Scott Stensland

Câu trả lời:


250

Uncommenting DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"trong /etc/default/dockerkhi Matt Carrier đề nghị đã không làm việc cho tôi. Cũng không đưa máy chủ DNS của công ty tôi vào tệp đó. Nhưng, có một cách khác (đọc tiếp).

Trước tiên, hãy xác minh vấn đề:

$ 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

Nếu lệnh xuất hiện bị treo nhưng cuối cùng lại xuất hiện lỗi "không thể giải quyết 'google.com'", thì bạn cũng gặp phải vấn đề giống như tôi.

Các nslookuplệnh truy vấn DNS Server 8.8.8.8 để chuyển địa chỉ văn bản của 'google.com' sang địa chỉ IP. Trớ trêu thay, 8.8.8.8 là máy chủ DNS công cộng của Google . Nếu nslookupkhông thành công, các máy chủ DNS công cộng như 8.8.8.8 có thể bị công ty của bạn chặn (mà tôi cho là vì lý do bảo mật).

Bạn sẽ nghĩ rằng việc thêm các máy chủ DNS của công ty bạn vào DOCKER_OPTStrong /etc/default/dockersẽ là một mẹo nhỏ, nhưng vì bất kỳ lý do gì, nó không hoạt động với tôi. Tôi mô tả những gì đã làm việc cho tôi dưới đây.

GIẢI PHÁP :

Trên máy chủ (tôi đang sử dụng Ubuntu 16.04), hãy tìm địa chỉ máy chủ DNS chính và phụ:

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

Sử dụng các địa chỉ này, tạo một tệp /etc/docker/daemon.json:

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

Đặt cái này vào /etc/docker/daemon.json:

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

Thoát khỏi root:

# exit

Bây giờ khởi động lại docker:

$ sudo service docker restart

KIỂM ĐỊNH :

Bây giờ, hãy kiểm tra xem việc thêm /etc/docker/daemon.jsontệp có cho phép bạn phân giải 'google.com' thành địa chỉ IP hay không:

$ 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

TÀI LIỆU THAM KHẢO :

Tôi dựa trên giải pháp của mình dựa trên một bài báo của Robin Winslow, người xứng đáng nhận được tất cả sự ghi nhận cho giải pháp. Cảm ơn, Robin!

"Sửa cấu hình DNS mạng của Docker." Robin Winslow. Truy cập ngày 11 tháng 11 năm 2016. https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/


3
Tôi đã gặp lỗi, rằng không thể bắt đầu dịch vụ sau khi thay đổi. Điều này là do tôi đã sửa đổi DOCKER_OPTS trong / etc / default / docker và /etc/init.d/docker. Hoàn nguyên thay đổi giải quyết các vấn đề khởi động của dịch vụ Docker
Twiebie

7
Điều này đã hiệu quả với tôi (trên mạng công ty) trong khi giải pháp được chấp nhận thì không.
David Ebbo

1
Điều này cũng hiệu quả với tôi trong khi giải pháp được chấp nhận thì không. Tôi đã sử dụng nslookup để lấy IP máy chủ DNS của mình mặc dù không phải nmcli.
Necro

2
daemon.json cũng làm việc cho tôi! Và bạn có thể kiểm tra nếu công ty của bạn đã bị chặn 8.8.8.8 bởi lệnh này nslookup google.com 8.8.8.8Trong trường hợp của tôi nó là như vậy tôi đã nhận lỗi nàyconnection timed out; no servers could be reached
ROTOGG

3
Tôi nghĩ lý do /etc/default/dockerkhông làm việc cho một số người được (trích dẫn một bình luận từ các tập tin)# THIS FILE DOES NOT APPLY TO SYSTEMD
Jakub Bochenski

88

Sau nhiều lần đau đầu, tôi đã tìm ra câu trả lời. Could not resolve 'archive.ubuntu.com'có thể được khắc phục bằng cách thực hiện các thay đổi sau:

  1. Bỏ ghi chú dòng sau trong /etc/default/docker
    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

  2. Khởi động lại dịch vụ Docker sudo service docker restart

  3. Xóa mọi hình ảnh đã lưu cài đặt DNS không hợp lệ trong bộ nhớ cache.

  4. Xây dựng lại và vấn đề sẽ được giải quyết.

Tín dụng được chuyển đến Andrew SB


7
bạn cũng có thể thêm --no-cache = true nếu bạn không muốn làm # 3 trên
jschorr

8
Điều này không hiệu quả với tôi và tôi không biết tại sao. Tôi đã đấu tranh với điều này liên tục trong nhiều tuần.
Corey Ogburn,

2
Tôi đang chạy trên Linux mint nên không có boot2docker. / etc / default / docker được tạo và có cờ DOCKER_OPTS ở trên. Tôi đã khởi động lại dịch vụ, xóa tất cả hình ảnh và vùng chứa nhưng vẫn không có gì.
Corey Ogburn,

2
@CoreyOgburn Tôi cũng sẽ thử --no-cache = true như đã đề cập ở trên của jschorr. ví dụ:docker build --no-cache=true ...
Matt Carrier,

6
Tôi đã chạy docker build --no-cache=true -t docker-whale .nhưng dường như không có gì khác biệt đã xảy ra.
Corey Ogburn,

46

Tôi gặp phải vấn đề tương tự, nhưng neiter bỏ ghi chú / etc / default / docker dns mục nhập cũng như chỉnh sửa /etc/resolv.conf trong vùng chứa bản dựng hoặc /etc/docker/daemon.json giúp tôi.

Nhưng sau khi tôi xây dựng với tùy chọn --network = host, việc phân giải đã ổn trở lại.

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

Có thể điều này sẽ giúp ai đó một lần nữa.


Tôi đã gặp một lỗi khác trong một thời gian dài "Không thể kết nối với archive.ubuntu.com:80 (xxxx). - connect (111: Kết nối bị từ chối)" và thấy rằng việc sử dụng --network = host hiện đã được khắc phục vấn đề của tôi
Eric Arseneau

Sau hàng tấn khắc phục sự cố, đây là điều duy nhất hiệu quả với tôi.
math0ne

15

Tôi tin rằng câu trả lời của Matt Carrier là giải pháp chính xác cho vấn đề này. Tuy nhiên, sau khi thực hiện nó, tôi vẫn quan sát các hành vi tương tự: could not resolve 'archive.ubuntu.com'.

Điều này khiến tôi cuối cùng nhận thấy rằng mạng tôi đã kết nối đang chặn DNS công cộng. Giải pháp cho vấn đề này là định cấu hình vùng chứa Docker của tôi để sử dụng cùng tên máy chủ mà máy chủ của tôi (máy mà tôi đang chạy Docker) đang sử dụng.

Tôi đã phân tích như thế nào:

  1. Vì tôi đang làm việc thông qua tài liệu Docker, tôi đã có một hình ảnh ví dụ được cài đặt trên máy của mình. Tôi đã có thể bắt đầu một vùng chứa mới để chạy hình ảnh đó và tạo một phiên bash mới trong vùng chứa đó:docker run -it docker/whalesay bash
  2. Vùng chứa có kết nối Internet không ?: ping 172.217.4.238(google.com)
  3. Vùng chứa có thể phân giải tên máy chủ không? ping google.com

Trong trường hợp của tôi, lần đầu tiên pingdẫn đến phản hồi, lần thứ hai thì không.

Cách tôi sửa:

Khi tôi phát hiện ra rằng DNS không hoạt động bên trong vùng chứa, tôi đã xác minh rằng tôi có thể sao chép cùng một hành vi trên máy chủ. nslookup google.comgiải quyết tốt trên máy chủ. Nhưng, nslookup google.com 8.8.8.8hoặc nsloookup google.com 8.8.4.4hết thời gian.

Tiếp theo, tôi tìm thấy (các) máy chủ định danh mà máy chủ của tôi đang sử dụng khi chạy nm-tool(trên Ubuntu 14.04). Trong bối cảnh thông tin phản hồi nhanh, tôi bắt đầu lên hình ảnh ví dụ một lần nữa, và thêm vào địa chỉ IP của máy chủ tên cho tập tin resolv.conf của container: sudo vi /etc/resolv.conf. Sau khi được lưu, tôi đã thử ping lại ( ping google.com) và lần này nó hoạt động!

Xin lưu ý rằng các thay đổi được thực hiện đối với giải quyết của vùng chứa là không liên tục và sẽ bị mất khi khởi động lại vùng chứa. Trong trường hợp của tôi, giải pháp thích hợp hơn là thêm địa chỉ IP của máy chủ định danh mạng của tôi vào /etc/default/dockertệp của máy chủ .


2
Các lệnh cụ thể để lấy địa chỉ máy chủ định danh: nmcli device show <interfacename> | grep IP4.DNS(Ubuntu> = 15) và nmcli dev list iface <interfacename> | grep IP4(Ubuntu <15). Tín dụng: Marty Fried .
r0estir0bbe

Đây là một câu trả lời bao quát hơn. Tôi luôn gặp sự cố khi chuyển sang mạng văn phòng của mình hoặc khi có thay đổi mạng. Việc thêm máy chủ DNS của công ty bạn sẽ khắc phục được sự cố tra cứu.
gvd

1
Rất hướng dẫn! Hiếm khi tìm thấy câu trả lời chỉ cho bạn cách xác minh sự cố, sau đó đưa ra bản sửa lỗi (và xác minh bản sửa lỗi hoạt động). Khắc phục sự cố tuyệt vời!
Matthew Kraus

Này, bạn có thể giúp tôi được không? Tôi đang gặp sự cố tương tự nhưng máy chủ của tôi là máy cửa sổ, nơi tôi đang cố chạy vùng chứa docker của mình và cố định cấu hình hình ảnh Ubuntu ở đó. Khi bạn nói về máy chủ định danh ở đây, nó có nghĩa là địa chỉ máy chủ DNS của máy tính windows của tôi? Và trong đó nữa, nó sẽ là cái chính hay cái thứ hai?
CodeHunter

Đây là sự cố chính xác mà tôi gặp phải khi tổ chức của tôi chặn DNS công cộng và việc đặt DNS của tổ chức trong / etc / default / docker trong DOCKER_OPTS đã hoạt động và sự cố đã được giải quyết. Tất cả đều hoan nghênh câu trả lời này ...
skm

7

Sau khi thêm ip cục bộ dns vào tệp docker mặc định, nó bắt đầu hoạt động đối với tôi ... vui lòng tìm các bước dưới đây ...

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

Bây giờ hãy tiếp tục và xây dựng docker ... :)


7

Đối với bất kỳ ai cũng đang gặp sự cố này, tôi đã giải quyết vấn đề của mình bằng cách chỉnh sửa /etc/default/dockertệp, như được đề xuất bởi các câu trả lời và câu hỏi khác. Tuy nhiên, tôi không biết IP nào sẽ sử dụng làm DNS.

Mãi một lúc sau tôi mới biết mình phải chạy ifconfig dockertrên máy chủ để hiển thị IP cho giao diện mạng 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)

Đó là 172.17.0.1trong trường hợp của tôi. Hy vọng điều này sẽ giúp bất cứ ai cũng đang gặp vấn đề này.


7
Nó sẽ rất hữu ích nếu bạn chỉ định cách thức mà bạn thay đổi nội dung tập tin Docker của bạn
physincubus

1
Trên Ubuntu 18.04:ifconfig docker0
automorphic

6

Tôi đã tìm thấy câu trả lời này sau một số lần Google. Tôi đang sử dụng Windows, vì vậy một số câu trả lời ở trên không áp dụng cho hệ thống tệp của tôi.

Về cơ bản chạy:

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

8.8.8.8Tôi tin rằng chỉ ghi đè máy chủ định danh hiện có được sử dụng với . Nó đã làm việc cho tôi!

Dựa trên một số nhận xét, bạn có thể phải root. Để làm điều đó, hãy phát hành sudo -i.


Điều này không hoạt động với tôi trên Windows 10, vì sshnó không tồn tại?
Seanny123

@ Seanny123 đã lâu rồi tôi chưa làm gì với điều này, nhưng tôi cũng đang sử dụng Windows 10. Tôi có thể đã sử dụng Hộp công cụ Docker cũ hơn vào thời điểm đó? Nếu không, bạn có thể cần phải kích hoạt Windows SSH Client . Tôi có lẽ sẽ bắt đầu với điều đó.
Engineero

1
điều này đã làm việc cho tôi sau khi tôi trở thành root, để làm điều đó, hãy phát hành sudo -ikhi bạn ở trong
MediaVince

5

Tôi chỉ muốn thêm phản hồi muộn cho bất kỳ ai gặp phải vấn đề này từ các công cụ tìm kiếm.

KHÔNG làm điều này: Tôi đã từng có một tùy chọn trong / etc / default / docker để đặt iptables=false. Điều này là do ufw không hoạt động (mọi thứ đều được mở mặc dù chỉ cho phép 3 cổng) nên tôi đã mù quáng làm theo câu trả lời cho câu hỏi này: Tường lửa không phức tạp (UFW) không chặn bất kỳ thứ gì khi sử dụng Dockercái này, được liên kết trong bình luận

Tôi có hiểu biết rất thấp về các quy tắc iptables / nat / định tuyến nói chung, do đó, tại sao tôi có thể đã làm điều gì đó phi lý.

Hóa ra có lẽ tôi đã định cấu hình sai nó và giết chết độ phân giải DNS bên trong các vùng chứa của mình. Khi tôi chạy một thiết bị đầu cuối vùng chứa tương tác:docker run -i -t ubuntu:14.04 /bin/bash

Tôi đã có những kết quả sau:

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

Việc hoàn nguyên tất cả cấu hình ufw của tôi (before.rules), tắt ufw và xóa iptables = false khỏi / etc / default / docker đã khôi phục chức năng phân giải DNS của vùng chứa.

Tôi hiện đang mong được kích hoạt lại chức năng ufw bằng cách làm theo các hướng dẫn sau .


3

Tôi gặp vấn đề tương tự và đã thử các bước được đề cập, nhưng dường như không có tác dụng nào cho đến khi làm mới cài đặt mạng.

Các bước:

  1. Như đã đề cập, thêm DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true"vào /etc/default/docker.
  2. Xả nội dung bảng PREROUTING theo cách thủ công bằng cách sử dụng iptables -t nat -F POSTROUTING. Sau khi chạy, khởi động lại docker và nó sẽ khởi tạo bảng nat với dải IP mới.

3

Vấn đề tương tự đối với tôi (trên Ubuntu Xenial).

  • docker run --dns ... cho các thùng chứa đã hoạt động.
  • Cập nhật các tùy chọn daemon của docker cho docker build(docker-soạn, v.v.) không hoạt động.

Sau khi phân tích các bản ghi của journalctl -u docker.servicedocker ( ) nếu tìm thấy một số cảnh báo về việc áp dụng giải quyết không hợp lệ.

Sau đó, tôi nhận thấy rằng máy chủ định danh của công ty chúng tôi đã được thêm vào giao diện mạng nhưng không phải trong Resolutionvconf.

Đã áp dụng giải pháp này Làm cách nào để định cấu hình DNS tĩnh của tôi trong các giao diện? (askubuntu) , tức là thêm máy chủ định danh vào/etc/resolvconf/resolv.conf.d/tail

Sau khi cập nhật Resolutionvconf (hoặc khởi động lại).

bash docker run --rm busybox nslookup google.com

hoạt động ngay lập tức.

Tất cả các bản dựng do docker-soạn của tôi hiện đang hoạt động.


2

Hôm nay tôi gặp sự cố tương tự, tôi vừa thêm dòng bên dưới vào / etc / default / docker

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

và sau đó tôi khởi động lại máy tính xách tay của mình.

Trong trường hợp của tôi, khởi động lại trình nền docker là không đủ đối với tôi, tôi phải khởi động lại Máy tính xách tay của mình để làm cho nó hoạt động.


2

Trước khi dành quá nhiều thời gian cho bất kỳ giải pháp nào khác, chỉ cần khởi động lại Docker và thử lại.

Đã giải quyết vấn đề cho tôi, sử dụng Docker Desktop cho Windows trên Windows 10.


Khởi động lại nó với quyền quản trị đã giải quyết được vấn đề trong trường hợp của tôi.
tĩnh mạch

1

Tôi cũng đã đấu tranh với điều này một thời gian, nhưng đây là những gì đã giải quyết nó cho tôi Ubuntu 16.04 x64. Tôi hy vọng nó cũng tiết kiệm thời gian của ai đó.

  1. Trong /etc/NetworkManager/NetworkManager.conf: bình luận ra #dns=dnsmasq

  2. Tạo (hoặc sửa đổi) /etc/docker/daemon.json:

{
    "dns": ["8.8.8.8"]
}
  1. Khởi động lại docker bằng: sudo service docker restart

Có vẻ là giải pháp tương tự như stackoverflow.com/a/40516974/2308683
OneCricketeer

Thật ra là không. Bản sửa lỗi trong NetworkManager.conf đã tạo ra sự khác biệt cho trường hợp của tôi.
palamunder

Tôi thực sự nghi ngờ việc vô hiệu hóa hệ thống dnsmasq rộng là giải pháp tốt nhất dành riêng cho Docker
OneCricketeer

Tôi đang chia sẻ những gì đã làm việc cho tôi sau khi chiến đấu 2 ngày với vấn đề này.
palamunder

Điều này không hiệu quả với tôi
desmond. 13

0

Trên hệ thống của tôi ( macOS High Sierra 10.13.6với Docker 2.1.0.1) điều này là do một proxy của công ty.

Tôi đã giải quyết vấn đề này bằng hai bước:

  1. Định cấu hình thủ công cài đặt proxy trong Preferences>Proxies
  2. Thêm các cài đặt tương tự vào config.json của bạn bên trong ~/.docker/config.jsonnhư:

     "proxies":
    {
      "default":
      {
        "httpProxy": "MYPROXY",
        "httpsProxy": "MYPROXY",
        "noProxy": "MYPROXYWHITELIST"
      }
    }
    
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.