Подтвердить что ты не робот

Docker build "Не удалось разрешить" archive.ubuntu.com "apt-get не смог установить что-либо

Я пытался запустить сборку Docker для различных файлов, которые раньше работали раньше, а теперь уже не работают.

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

RUN apt-get -y install supervisor nodejs npm

Обычное сообщение, которое показывалось в журналах, было

Could not resolve 'archive.ubuntu.com'

Есть идеи, почему какое-либо программное обеспечение не будет установлено?

4b9b3361

Ответ 1

После сильной головной боли я нашел ответ. Could not resolve 'archive.ubuntu.com' может быть исправлено путем внесения следующих изменений:

  • Раскомментируйте следующую строку в /etc/default/docker
    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

  • Перезапустите службу Docker sudo service docker restart

  • Удалите все изображения, которые кэшировали недопустимые настройки DNS.

  • Постройте снова, и проблема должна быть решена.

Кредит отправляется Andrew SB

Ответ 2

Раскомментирование DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4" в /etc/default/docker, как предложил Мэтт Кэрриер, НЕ помогло мне. Также не помещал 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

ЛИТЕРАТУРЫ:

Я основал свое решение на статье Робина Уинслоу, которая заслуживает всяческих похвал за это решение. Спасибо, Робин!

Msgstr "Исправить настройки DNS для Docker." Робин Уинслоу Получено 2016-11-09. https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/

Ответ 3

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

Но после того, как я собрал опцию --network = host, разрешение снова было в порядке.

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

Может быть, это поможет кому-то снова.

Ответ 4

Я считаю, что ответ Matt Carrier является правильным решением для этой проблемы. Однако после его реализации я все еще наблюдал такое же поведение: could not resolve 'archive.ubuntu.com'.

Это привело меня к тому, что я обнаружил, что сеть, к которой я был подключен, блокирует публичный DNS. Решение этой проблемы состояло в том, чтобы сконфигурировать мой контейнер Docker для использования того же самого сервера имен, который использовал мой хост (машина, с которой я работал Docker).

Как я triaged:

  • Поскольку я работал с документацией Docker, у меня уже был пример изображения, установленного на моей машине. Я смог запустить новый контейнер для запуска этого изображения и создать новый сеанс bash в этом контейнере: docker run -it docker/whalesay bash
  • Имеется ли у контейнера интернет-соединение?: ping 172.217.4.238 (google.com)
  • Может ли контейнер разрешать имена хостов? 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), и на этот раз он сработает!

Обратите внимание, что изменения, внесенные в контейнер resolv.conf, не являются постоянными и будут потеряны во время перезапуска контейнера. В моем случае более подходящим решением было добавить IP-адрес моего сетевого сервера имен в файл хоста /etc/default/docker.

Ответ 5

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

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

Теперь идите и постройте докер...:)

Ответ 6

Для тех, кто также сталкивается с этой проблемой, я решил проблему, отредактировав файл /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

Я просто хотел добавить поздний ответ для всех, кто попадает в эту проблему из поисковых систем.

НЕ делать этого: У меня была опция /etc/default/docker для установки iptables=false. Это было связано с тем, что ufw не работал (все было открыто, хотя разрешено только 3 порта), поэтому я слепо последовал за ответом на этот вопрос: Uncomplicated Firewall (UFW) не блокирует ничего, когда используя Docker и это, которое было связано в комментариях

У меня очень слабое понимание правил iptables/nat/routing в целом, поэтому я мог бы сделать что-то иррациональное.

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

У меня были следующие результаты:

[email protected]:/# ping google.com
ping: unknown host google.com

[email protected]:/# cat /etc/resolv.conf
search online.net
nameserver 8.8.8.8
nameserver 8.8.4.4

[email protected]:/# 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, вместо этого эти инструкции.

Ответ 8

Я нашел этот ответ после некоторого Googleing. Я использую Windows, поэтому некоторые из вышеперечисленных ответов не применимы к моей файловой системе.

В основном выполняется:

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

Что просто перезаписывает существующий сервер имен, используемый с 8.8.8.8, я считаю. Это сработало для меня!

Ответ 9

У меня такая же проблема, и я попробовал описанные шаги, но, похоже, никто не работает до обновления сетевых настроек.

Этапы:

  • Как уже упоминалось, добавьте DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true" в /etc/default/docker.
  • Вручную сбросьте содержимое таблицы PREROUTING с помощью iptables -t nat -F POSTROUTING. После запуска перезапустите докер и инициализируйте таблицу nat новым диапазоном IP.

Ответ 10

Такая же проблема для меня (на Ubuntu Xenial).

  • docker run --dns ... для обработанных контейнеров.
  • Обновление параметров демона докеров для docker build (docker-compose и т.д.) не сработало.

После анализа журналов докеров (journalctl -u docker.service), если обнаружено некоторое предупреждение о неправильном применении resolvconf.

После этого я обнаружил, что наши корпоративные серверы имен были добавлены к сетевым интерфейсам, но не в resolvconf.

Применяется это решение Как настроить мой статический DNS в интерфейсах? (askubuntu), то есть добавление серверов имен в /etc/resolvconf/resolv.conf.d/tail

После обновления resolvconf (или перезагрузки).

bash docker run --rm busybox nslookup google.com

работал мгновенно.

Теперь все мои сборки для докеры работают.

Ответ 11

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

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

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

В моем случае перезапуск демона докеры для меня недостаточно, мне нужно перезагрузить свой ноутбук, чтобы он работал.

Ответ 12

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

Решил проблему для меня, используя Docker Desktop для Windows на Windows 10.

Ответ 13

В моей системе (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"
      }
    }