Dockerfile: сборка Docker не может загружать пакеты: centos- ›yum, debian / ubuntu-› apt-get за внутренней сетью

ПРОБЛЕМА. Любая сборка с файлом Dockerfile, зависящим от centos, ubuntu или debian, не может быть создана.

СРЕДА: У меня Mac OS X, запущена VMWare с гостевым Ubuntu 14.04, запущен Docker:

mdesales@ubuntu ~ $ sudo docker version
Client version: 1.1.2
Client API version: 1.13
Go version (client): go1.2.1
Git commit (client): d84a070
Server version: 1.1.2
Server API version: 1.13
Go version (server): go1.2.1
Git commit (server): d84a070

ПОВЕДЕНИЕ: Использование "docker build" не позволяет загружать пакеты. Вот пример такого Dockerfile: https://github.com/Krijger/docker-cookbooks/blob/master/jdk8-oracle/Dockerfile, https://github.com/ottenhoff/centos-java/blob/master/Dockerfile

Я знаю, что мы можем запустить контейнер с --dns, но это во время сборки.

  • CENTOS

    ИЗ centos RUN yum install a b c

  • УБУНТУ

    ИЗ ubuntu ЗАПУСКАТЬ apt-get install a b c

Пользователи сообщают, что это могут быть проблемы с конфигурацией DNS, другие, и конфигурация имеет закомментированные DNS-серверы Google.

Step 2 : RUN yum install -y curl; yum upgrade -y; yum update -y;  yum clean all
 ---> Running in 5f11b65c87b8
Loaded plugins: fastestmirror
Couldn't resolve host 'mirrorlist.centos.org

Тем не менее проблема не исчезла ... Итак, большинство пользователей # docker @ Freenode упомянули, что это может быть проблема с конфигурацией DNS ... Итак, вот мой Ubuntu:

$ sudo cat /etc/resolv.conf 
nameserver 127.0.1.1
search localdomain

Я попытался изменить это, та же проблема ...


person Marcello de Sales    schedule 05.08.2014    source источник


Ответы (7)


ПРОБЛЕМА

Поговорив с некоторыми разработчиками на # docker @ freenode, проблема была очевидна для всех: DNS и среда. Сборка отлично работает при обычном домашнем интернет-подключении.

РЕШЕНИЕ:

Эта проблема возникает в среде, где есть частный DNS-сервер, или сеть блокирует DNS-серверы Google. Даже если докер-контейнер может пинговать 8.8.8.8, сборка все равно должна иметь доступ к тому же частному DNS-серверу, который находится за вашим брандмауэром или центром обработки данных.

Запустите демон Docker с переключателем --dns, чтобы он указывал на ваш частный DNS-сервер, точно так же, как настроена ОС вашего хоста. Это было найдено методом проб и ошибок.

Подробности

Моя MAC OS X, ОС хоста, имела другой DNS, настроенный в моем /etc/resolv.conf:

mdesales@Marcello-Work ~ (mac) $ cat /etc/resolv.conf
search corp.my-private-company.net
nameserver 172.18.20.13
nameserver 172.20.100.29

Мой хост мог сбрасывать пакеты на IP-адрес Google 8.8.8.8 во время сборки ... Я просто взял эти 2 IP-адреса и поместил в конфигурацию демона докеров Ubuntu:

mdesales@ubuntu ~ $ cat /etc/default/docker
...
...
# Use DOCKER_OPTS to modify the daemon startup options.
DOCKER_OPTS="--dns 172.18.20.13 --dns 172.20.100.29 --dns 8.8.8.8"
...

Теперь сборка работает должным образом!

$ sudo ./build.sh 
Sending build context to Docker daemon 7.168 kB
Sending build context to Docker daemon 
Step 0 : FROM centos
 ---> b157b77b1a65
Step 1 : MAINTAINER [email protected]
 ---> Running in 49bc6e233e4c
 ---> 2a380810ffda
Removing intermediate container 49bc6e233e4c
Step 2 : RUN yum install -y curl; yum upgrade -y; yum update -y;  yum clean all
 ---> Running in 5f11b65c87b8
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: mirror.supremebytes.com
 * extras: centos.mirror.ndchost.com
 * updates: mirrors.tummy.com
Resolving Dependencies
--> Running transaction check
---> Package systemd.x86_64 0:208-11.el7 will be updated
---> Package systemd.x86_64 0:208-11.el7_0.2 will be an update
---> Package systemd-libs.x86_64 0:208-11.el7 will be updated
---> Package systemd-libs.x86_64 0:208-11.el7_0.2 will be an update
--> Finished Dependency Resolution

Спасибо @BrianF и другим, кто помогал на канале IRC!

Постоянное решение ВМ - ОБНОВЛЕНИЕ 2 ИЮЛЯ 2015 ГОДА

Теперь у нас есть GitHub Enterprise и CoreOS Enterprise Docker Registry ... Итак, для меня было важно добавить корпоративные DNS-серверы с HOST-машины, чтобы виртуальная машина также работала.

Замена /etc/resolv.conf из гостевой ОС на /etc/resolv.conf хоста также решила проблему! Докер 1.7.0. Я только что создал новую виртуальную машину с использованием Ubuntu 15.04 на VMWare Fusion, и у меня снова возникла эта проблема ...

/etc/resolv.conf ДО

~/dev/github/public/stackedit on ⭠ master ⌚ 20:31:02
$ cat /etc/resolv.conf 
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1
search localdomain

/etc/resolv.conf ПОСЛЕ *

~/dev/github/public/stackedit on ⭠ master ⌚ 20:56:09
$ cat /etc/resolv.conf 
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
search corp.mycompany.net
nameserver 10.180.194.35
nameserver 10.180.194.36
nameserver 192.168.1.1
person Marcello de Sales    schedule 05.08.2014
comment
В Ubuntu 14.04 файл systemd находится в /lib/systemd/system/docker.service. Добавьте ту же строку в инструкцию EXEC. - person Marcello de Sales; 24.06.2015
comment
Связанный ответ о местонахождении DOCKER_OPTS находится по адресу stackoverflow.com/a/30505018/433814 - person Marcello de Sales; 24.06.2015
comment
Другое решение, которое я нашел, заключалось в использовании того же HOST /etc/resolv.conf в виртуальной машине ... - person Marcello de Sales; 03.07.2015
comment
resolve.conf указывал на мою обратную петлю 127.0.01. Изменив его на google DNS nameserver 8.8.8.8, он заработал. Спасибо ! - person koxon; 04.09.2015
comment
Мне также пришлось удалить частный DNS, как в (askubuntu.com/questions/627899/…) БОНУС oneliner: DOCKER_OPTS = $ (cat /etc/resolv.conf | grep nameserver | awk '{printf --dns $ 2}') && перезапуск докера службы sudo - person ElMesa; 02.05.2016

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

ENV HTTP_PROXY http://<proxy_host>:<port>
ENV HTTPS_PROXY http://<proxy_host>:<port>
ENV http_proxy http://<proxy_host>:<port>
ENV https_proxy http://<proxy_host>:<port>
person Anton    schedule 28.07.2015

Вероятно, это связано с тем, что ваш локальный кеширующий сервер имен прослушивает 127.0.1.1, который недоступен из контейнера.

Попробуйте ввести в свой Dockerfile следующее:

CMD "sh" "-c" "echo nameserver 8.8.8.8 > /etc/resolv.conf"
person Wil Tan    schedule 05.08.2014
comment
У меня это не сработало :( За внутренней сетью единственным решением было добавить DNS-серверы в конфигурацию демона. - person Marcello de Sales; 05.08.2014

Кроме того, простое добавление серверов имен с хоста (в моем случае Mac OSX) на виртуальную машину docker-machine решает проблему.

person resultsway    schedule 21.08.2015

Для меня проблема заключалась в том, что мой интернет-провайдер заблокировал DNS Google (8.8.8.8), который докер использует в качестве резервного по умолчанию.

Хитрость здесь в том, чтобы узнать ваш IP-адрес DNS и указать докеру, чтобы он его использовал.

В моем случае (под управлением Ubuntu 17.04) попытка получить эту информацию из /etc/resolv.conf не сработала, но я использовал эту команду:

nmcli dev show | grep IP4.DNS

Затем я взял этот IP и добавил в /etc/defaults/docker:

DOCKER_OPTS="--dns 192.168.50.1"

Теперь перезапустите демон Docker и попробуйте снова построить.

person Lucas Lobosque    schedule 17.10.2017

В моем случае проблема в том, что DNS нашей компании имеет несколько недостатков, что требует подделки /etc/hosts, а для докера /etc/docker/daemon.json. Это файл, который скрывал ошибку:

{
    "dns": ["10.5...", "10.5...", "10.5..."]
}

Я сделал резервную копию и заменил ее на

{
    "dns": ["8.8.8.8", "8.8.4.4"]
}

И это заработало. Я ищу решение, которое будет работать во всех случаях - в нашей VPN, которая требует настраиваемых DNS-серверов, а также дома в обычной сети.

Обратите внимание, что в современном Linux создается /etc/hosts, а DNS управляется SystemD. Я не уверен, как Docker справляется с этим, но, возможно, этого будет достаточно, чтобы указать на поддельный DNS SystemD по адресу 127.0.0.53.

person Ondra Žižka    schedule 02.07.2018

Создайте локальное зеркало репо - это также можно сделать как docker-mirror-packages-repo

Затем запустите "docker build --add-host "archive.ubuntu.com:repo-docker-ip", чтобы процесс сборки загрузился с локального зеркала. Это не только быстрее, но и обеспечивает лучшую воспроизводимость ваших сборок.

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

person Guido U. Draheim    schedule 27.11.2018