Docker build "Не вдалося вирішити" archive.ubuntu.com "" apt-get не вдається нічого встановити


101

Я намагався запустити Docker-збірник на різних файлах, які раніше працювали, які зараз більше не працюють.

Як тільки файл Docker включив будь-який рядок, який повинен був встановити програмне забезпечення, він вийшов з ладу з повідомленням про те, що пакет не знайдено.

RUN apt-get -y install supervisor nodejs npm

Поширене повідомлення, яке з’явилося в журналах, було

Could not resolve 'archive.ubuntu.com'

Будь-яка ідея, чому будь-яке програмне забезпечення не буде встановлено?


це станеться, коли машина відключається від мережі ... Я бачив, що це відбувається на ноутбуці Linux з новою установкою докера, якщо я випускаю лише newgrp dockerзамість того, щоб робити повний журнал, а потім увійдіть після надання себе sudo usermod -aG docker myuserid... його крайній випадок для впевнений, що все-таки буває
Скотт Стенсленд

Відповіді:


250

Розкоментувати DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"в /etc/default/dockerякості Matt Carrier запропонував нічого НЕ працювати для мене. Також у цей файл не було розміщено DNS-сервери моєї корпорації. Але є й інший спосіб (читайте далі).

Спочатку давайте перевіримо проблему:

$ 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

Якщо команда зависає, але врешті-решт викриває помилку "не вдається вирішити" google.com "", у вас є та сама проблема, що і я.

nslookupКоманда запитує DNS - сервер 8.8.8.8 для того , щоб перетворити текст адреси «google.com» в IP - адреса. Як не дивно, 8.8.8.8 є загальнодоступним сервером DNS Google . Якщо nslookupне вдасться, ваша компанія може заблокувати загальнодоступні сервери DNS на зразок 8.8.8.8 (напевно, з міркувань безпеки).

Можна подумати , що додавання DNS - серверів вашої компанії , щоб DOCKER_OPTSв системі /etc/default/dockerмає зробити трюк, але з якоїсь - то причини, це не робота для мене. Я описую те, що працювало для мене нижче.

РІШЕННЯ :

На хості (я використовую Ubuntu 16.04) дізнайтеся основні та вторинні адреси сервера DNS:

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

За допомогою цих адрес створіть файл /etc/docker/daemon.json:

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

Помістіть це /etc/docker/daemon.json:

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

Вихід із кореня:

# exit

Тепер перезапустіть докер:

$ sudo service docker restart

ВЕРИФІКАЦІЯ :

Тепер перевірте, що додавання /etc/docker/daemon.jsonфайла дозволяє вирішити "google.com" в 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

СПИСОК ЛІТЕРАТУРИ :

Я базував своє рішення на статті Робіна Уінслоу, який заслуговує на всю заслугу цього рішення. Спасибі, Робіне!

"Виправити мережеву конфігурацію DNS Docker." Робін Уінслоу. Отримано 2016-11-09. https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/


3
Я отримав помилку про те, що послугу неможливо запустити після змін. Це було тому, що я змінив DOCKER_OPTS в / etc / default / docker та /etc/init.d/docker. Повернення змін вирішило проблему запуску послуги
докера

7
Це працювало для мене (в мережі компанії), поки прийняте рішення не робило.
Девід Еббо

1
Це працювало і для мене, поки прийняте рішення не робило. Я використовував nslookup, щоб отримати IP свого сервера DNS, хоча не nmcli.
Некро

2
daemon.json працює і для мене! І ви можете перевірити, чи ваша компанія заблокувала 8.8.8.8 за допомогою цієї команди. nslookup google.com 8.8.8.8У моєму випадку це так, я отримав цю помилкуconnection timed out; no servers could be reached
ROTOGG

3
Я думаю, що причина /etc/default/dockerне спрацювала для деяких людей (цитуючи коментар з файлу)# THIS FILE DOES NOT APPLY TO SYSTEMD
Якуб Боченський

88

Після сильного головного болю я знайшов відповідь. Could not resolve 'archive.ubuntu.com'можна виправити, внісши такі зміни:

  1. Відмініть наступний рядок у /etc/default/docker
    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

  2. Перезапустіть службу Docker sudo service docker restart

  3. Видаліть будь-які зображення, які кешували недійсні настройки DNS.

  4. Побудуйте заново, і проблему слід вирішити.

Кредит належить Ендрю СБ


7
ви також можете додати --no-cache = true, якщо ви краще не зробите це №3 вище
jschorr

8
Це не працює для мене, і я не знаю, чому. Я боровся з цим і вимикаюсь тиждень.
Corey Ogburn

2
Я біжу на монетному дворі Linux, щоб не було boot2docker. / etc / default / docker створений і має прапор DOCKER_OPTS вгорі. Я перезапустив службу, очистив усі зображення та контейнери, але все одно нічого.
Корі Огберн

2
@CoreyOgburn Я також спробував би --no-cache = true, як згадував jschorr вище. напр.docker build --no-cache=true ...
Метт Перевізник

6
Я побіг, docker build --no-cache=true -t docker-whale .але нічого іншого, здається, не сталося.
Корі Огберн

46

Я зіткнувся з тією ж проблемою, але неітерментовані коментарі / etc / default / docker dns записи чи редагування /etc/resolv.conf в контейнері збірки або /etc/docker/daemon.json допомагає мені.

Але після того, як я будую з опцією --network = хост, рішення було знову добре.

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

Можливо, це знову комусь допоможе.


Я давно отримував іншу помилку: "Не вдалося підключитися до archive.ubuntu.com:80 (xxxx). моя проблема
Ерік Арсено

Після тонни усунення несправностей це єдине, що працювало для мене.
math0ne

15

Я вважаю, що відповідь Метта Кар'єра - це правильне рішення цієї проблеми. Тим НЕ менше, після його реалізації, я по- , як і раніше спостерігається таку ж поведінку: could not resolve 'archive.ubuntu.com'.

Це змусило мене врешті-решт виявити, що мережа, до якої я був підключений, блокує загальнодоступний DNS. Рішенням цієї проблеми було налаштувати мій контейнер Docker на той самий сервер імен, який використовував мій хост (машина, з якої я працював Docker).

Як я спрацьовував:

  1. Оскільки я працював над документацією Docker, у мене вже був встановлений приклад зображення на моїй машині. Мені вдалося запустити новий контейнер, щоб запустити це зображення та створити новий сеанс bash у цьому контейнері:docker run -it docker/whalesay bash
  2. Чи є контейнер підключення до Інтернету ?: ping 172.217.4.238(google.com)
  3. Чи може контейнер вирішувати імена хостів? ping google.com

У моєму випадку перший pingпризвів до відповідей, другий - ні.

Як я виправив:

Як тільки я виявив, що DNS не працює всередині контейнера, я переконався, що можу дублювати таку саму поведінку на хості. nslookup google.comвирішено просто добре на хості. Але, nslookup google.com 8.8.8.8або nsloookup google.com 8.8.4.4вичерпано.

Далі я знайшов сервери (ів), якими користувався мій хост, запустивши nm-tool(на Ubuntu 14.04). У дусі швидкого зворотного зв'язку, я завела приклад зображення знову, і додала IP - адреса сервера імен в файл resolv.conf контейнера: sudo vi /etc/resolv.conf. Після збереження я знову спробував ping ( ping google.com), і цього разу він спрацював!

Зауважте, що зміни, внесені до контейнера на резолюцію.conf, не є стійкими і втрачаються під час перезавантаження контейнера. У моєму випадку більш прийнятним рішенням було додати IP-адресу сервера імен моєї мережі до /etc/default/dockerфайлу хоста .


2
Конкретні команди для отримання серверів імен адрес: nmcli device show <interfacename> | grep IP4.DNS(Ubuntu> = 15) і nmcli dev list iface <interfacename> | grep IP4(Ubuntu <15). Кредит: Марті Фрід .
r0estir0bbe

Це більш обширна відповідь. У мене завжди виникають проблеми, коли я перемикаюся на свою офісну мережу або коли відбуваються зміни мережі. Додавання DNS-сервера вашої компанії виправляє проблему пошуку.
gvd

1
Дуже повчально! Рідко можна зустріти відповіді, які показують, як перевірити проблему, а потім надати виправлення (і перевірити, чи працює виправлення). Чудове усунення несправностей!
Матвій Краус

Гей, чи можете ви мені допомогти? У мене виникає така ж проблема, але мій хост - це машина Windows, на якій я намагаюся запустити контейнер докера і намагаюся налаштувати зображення Ubuntu там. Якщо ви тут говорите про сервер імен, чи означає це DNS-сервер моєї машини Windows? І в цьому теж буде первинним чи вторинним?
CodeHunter

З цією проблемою я зіткнувся, коли моя організація заблокувала загальнодоступний DNS і встановлення DNS організації в / etc / default / docker під DOCKER_OPTS працювало, і проблема вирішена. Усі вітаю цю відповідь ...
skm

7

Після додавання локального dns ip до docker-файлу за замовчуванням він почав працювати для мене ... будь ласка, знайдіть наведені нижче кроки ...

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

Тепер ідіть і будуйте докер ... :)


7

Для всіх, хто також має цю проблему, я вирішив свою проблему, відредагувавши /etc/default/docker файл, як це запропоновано іншими відповідями та питаннями. Однак я не мав уявлення, який IP використовувати в якості DNS.

Лише через деякий час я зрозумів, що мені потрібно запустити ifconfig dockerхост, щоб показати IP для мережевого інтерфейсу докер.

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)

Це було 172.17.0.1в моєму випадку. Сподіваюсь, це допоможе всім, у кого також виникає ця проблема.


7
Було б корисно, якби ви вказали спосіб редагування файлу
докера

1
В Ubuntu 18.04:ifconfig docker0
Автоморфні

6

Цю відповідь я знайшов після деяких Googleing. Я використовую Windows, тому деякі з перерахованих вище відповідей не стосувалися моєї файлової системи.

В основному виконуйте:

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

Який тільки переписує існуючий сервер імен, який 8.8.8.8я використовую, я вважаю. Це працювало на мене!

Виходячи з деяких коментарів, можливо, вам доведеться мати корінь. Для цього видайте sudo -i.


Це не спрацювало для мене в Windows 10, оскільки sshне існує?
Seanny123

@ Seanny123 минув певний час, оскільки я з цим щось робив, але також був у Windows 10. Можливо, я використовував старі Docker Toolbox в той час? Інакше вам може знадобитися ввімкнути клієнт Windows SSH . Я б, мабуть, почав з цього.
Engineero

1
це вийшло для мене після того, як я став root, щоб зробити це, sudo -i
видайте

5

Я просто хотів додати пізню відповідь для тих, хто стикається з цим питанням із пошукових систем.

НЕ робіть цього: я раніше встановлював опцію в / etc / default / docker iptables=false. Це було через те, що ufw не працював (все було відкрито, хоча було дозволено лише 3 порти), тому я сліпо стежив за відповіддю на це питання: Нескладний брандмауер (UFW) нічого не блокує при використанні Docker, і це, що було пов’язано в коментарі

Я дуже низько розумію правила iptables / nat / маршрутизації взагалі, отже, чому я, можливо, зробив щось ірраціональне.

Виявляється, я, мабуть, неправильно його налаштував і вбив роздільну здатність DNS всередині своїх контейнерів. Коли я запустив інтерактивний контейнерний термінал:docker run -i -t ubuntu:14.04 /bin/bash

У мене були такі результати:

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

Повернення всієї моєї конфігурації ufw (before.rules), відключення ufw та видалення iptables = false з / etc / default / docker відновило функцію роздільної здатності DNS контейнерів.

Зараз я з нетерпінням чекаю знову включити функціональність ufw, дотримуючись цих інструкцій .


3

У мене є те саме питання, і я спробував вказані кроки, але, здається, жоден не працює, поки не оновить мережеві налаштування.

Етапи:

  1. Як було сказано, додати DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true"до /etc/default/docker.
  2. Вручну змийте вміст таблиці ПЕРЕДАЧА за допомогою iptables -t nat -F POSTROUTING. Після запуску цього перезапустіть докер і він ініціалізує nat таблицю з новим діапазоном IP.

3

Те саме питання для мене (на Ubuntu Xenial).

  • docker run --dns ... для відпрацьованих контейнерів
  • Оновлення параметрів демона docker для docker build(docker-compose тощо) не працювало.

Після аналізу докерських журналів ( journalctl -u docker.service), якщо знайдено попередження про неправильну резолюціюconf застосовано.

Після цього я виявив, що наші корпоративні сервери імен були додані до мережевих інтерфейсів, але не у резолюціїconv.

Застосовується це рішення Як налаштувати свій статичний DNS в інтерфейси? (askubuntu) , тобто додавання серверів імен до/etc/resolvconf/resolv.conf.d/tail

Після оновлення resolutionvconf (або перезавантаження).

bash docker run --rm busybox nslookup google.com

працювали миттєво.

Всі мої докерні композиції працюють зараз.


2

У мене сьогодні така ж проблема, я просто додав рядок нижче до / etc / default / docker

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

а потім я перезапустив свій ноутбук.

У моєму випадку перезавантаження демона docker для мене недостатньо, я повинен перезапустити свій ноутбук, щоб він працював.


2

Перш ніж витрачати занадто багато часу на будь-яке інше рішення, просто перезавантажте Docker і повторіть спробу.

Для мене вирішили проблему, використовуючи Docker Desktop для Windows в ОС Windows 10.


Перезапуск з правами адміністратора вирішив проблему в моєму випадку.
вена

1

Я певний час боровся з цим і зараз, але ось воно вирішило це для мене Ubuntu 16.04 x64. Я сподіваюся, що це також економить чийсь час.

  1. В /etc/NetworkManager/NetworkManager.conf: коментуй #dns=dnsmasq

  2. Створіть (або змініть) /etc/docker/daemon.json:

{
    "dns": ["8.8.8.8"]
}
  1. Перезавантажте докер за допомогою: sudo service docker restart

Здається, таке ж рішення , як stackoverflow.com/a/40516974/2308683
OneCricketeer

Насправді ні. Виправлення в NetworkManager.conf змінило мій випадок.
паламундр

Я дуже сумніваюся, що відключення системи dnsmasq по всій країні є найкращим рішенням спеціально для Docker
OneCricketeer

Я ділюся тим, що працювало для мене після боротьби з цією проблемою 2 дні.
паламундр

Це не спрацювало для мене
desmond13

0

У моїй системі ( macOS High Sierra 10.13.6з Docker 2.1.0.1) це було пов’язано з корпоративним проксі.

Я вирішив це двома кроками:

  1. Налаштування параметрів проксі вручну Preferences>Proxies
  2. Додайте ті самі налаштування до config.json всередині, ~/.docker/config.jsonяк:

     "proxies":
    {
      "default":
      {
        "httpProxy": "MYPROXY",
        "httpsProxy": "MYPROXY",
        "noProxy": "MYPROXYWHITELIST"
      }
    }
    
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.