Docker build "Не удалось разрешить" archive.ubuntu.com "apt-get не смог установить что-либо
Я пытался запустить сборку Docker для различных файлов, которые раньше работали раньше, а теперь уже не работают.
Как только в файле Docker будет указана строка для установки программного обеспечения, произойдет сбой с сообщением о том, что пакет не найден.
RUN apt-get -y install supervisor nodejs npm
Обычное сообщение, которое показывалось в журналах, было
Could not resolve 'archive.ubuntu.com'
Есть идеи, почему какое-либо программное обеспечение не будет установлено?
Ответы
Ответ 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
) это было из-за корпоративного прокси.
Я решил это двумя шагами:
- Настройте параметры прокси вручную в
Preferences>Proxies
Добавьте те же настройки в ваш config.json внутри ~/.docker/config.json
, например:
"proxies":
{
"default":
{
"httpProxy": "MYPROXY",
"httpsProxy": "MYPROXY",
"noProxy": "MYPROXYWHITELIST"
}
}