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 ответов:
Раскомментировав
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 - тогда у вас та же проблема, что и у меня.
Команда
Вы могли бы подумать, что добавление DNS-серверов вашей компании вnslookup
запрашивает DNS-сервер 8.8.8.8 для того, чтобы включить текстовый адрес из 'google.com-на IP-адрес. По иронии судьбы, 8.8.8.8 - этопубличный DNS-сервер Google . Еслиnslookup
потерпит неудачу, публичные DNS-серверы, такие как 8.8.8.8, могут быть заблокированы вашей компанией (что, как я предполагаю, из соображений безопасности).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'
можно исправить, внеся следующие изменения:
Раскомментируйте следующую строку в
/etc/default/docker
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
Перезапустите службу Docker
sudo service docker restart
Удалите все изображения, которые кэшировали недопустимые параметры DNS.
- постройте снова, и проблема должна быть решена.
Кредит переходит к Эндрю СБ
Я считаю, что ответ Мэтта Кэрриера является правильным решением этой проблемы. Однако после его реализации я все еще наблюдал то же самое поведение:
Это привело меня в конечном итоге к тому, что сеть, к которой я был подключен, блокировала общедоступную DNS. Решение этой проблемы состояло в настройке контейнера Docker для использования того же сервера имен, что и мой хост (машина, с которой я запускал Docker).could not resolve 'archive.ubuntu.com'
.Как Я ... сортировка:
В моем случае первый
- поскольку я работал с документацией 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-адрес сервера имен к разрешению контейнера.конф файл: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
, я полагаю. Это сработало для меня!
У меня та же проблема, и я попробовал шаги, упомянутые выше, но, кажется, ни один не работает, пока не обновить настройки сети.
Шаги:
- Как уже упоминалось, добавьте
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true"
к/etc/default/docker
.- вручную промойте содержимое таблицы предварительной маршрутизации с помощью кнопки
iptables -t nat -F POSTROUTING
. После выполнения этого, перезагрузите docker, и он инициализирует таблицу nat с новым диапазоном IP.
Та же проблема для меня (на Ubuntu Xenial).
docker run --dns ...
для контейнеров работал.- обновление параметров демона docker для
docker build
(docker-compose etc.) не получилось.После анализа журналов docker (
После этого я обнаружил, что наши корпоративные серверы имен были добавлены в сетевые интерфейсы, но не в resolvconf.journalctl -u docker.service
), Если найдено некоторое предупреждение о плохом 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 недостаточно для меня, я должен перезагрузить свой ноутбук, чтобы заставить его работать.