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


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

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

RUN apt-get -y install supervisor nodejs npm

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

Could not resolve 'archive.ubuntu.com'

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

11 69

11 ответов:

Раскомментировав 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

Ссылки :

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

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

После долгой головной боли я нашел ответ. 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. постройте снова, и проблема должна быть решена.

Кредит переходит к Эндрю СБ

Я считаю, что ответ Мэтта Кэрриера является правильным решением этой проблемы. Однако после его реализации я все еще наблюдал то же самое поведение: 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-адрес сервера имен к разрешению контейнера.конф файл: sudo vi /etc/resolv.conf. После сохранения я снова попытался выполнить ping (ping google.com), и на этот раз это сработало!

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

После добавления локального 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)
Теперь идите вперед и постройте докер... :)

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

Только через некоторое время я понял, что мне нужно запустить ifconfig docker на хосте, чтобы показать IP-адрес сетевого интерфейса 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)

Это было 172.17.0.1 в моем случае. Надеюсь, это поможет всем, кто также имеет эту проблему.

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

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

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

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

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

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

I у меня очень низкое понимание правил 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 (ранее.правила), отключение ufw и удаление iptables=false из /etc / default / docker восстановили функциональность разрешения DNS контейнер.

Теперь я с нетерпением жду повторного включения функциональности ufw, следуя этим инструкциям вместо этого.

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

В основном выполнить:

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

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

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

Шаги:

  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. После выполнения этого, перезагрузите docker, и он инициализирует таблицу nat с новым диапазоном IP.

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

  • docker run --dns ... для контейнеров работал.
  • обновление параметров демона docker для docker build (docker-compose etc.) не получилось.

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

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

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

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

bash docker run --rm busybox nslookup google.com

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

Все мои сборки docker-compose теперь работают.

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

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

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

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