Dockerfile: docker build не может загружать пакеты: centos - >yum, debian / ubuntu - >apt-get behind intranet

проблема: любая сборка с 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 Запустите yum install a b c

  • UBUNTU

    из 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

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

6 ответов


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

устранение:

эта проблема возникает в среде, которая имеет частный DNS-сервер, или сеть блокирует DNS-серверы Google. Даже если контейнер docker может выполнить ping 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-адреса и размещены в конфигурации демона docker 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 Marcello_deSales@intuit.com
 ---> 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-канале!

постоянное решение VM-обновление 2 июля 2015

теперь у нас есть реестр GitHub Enterprise и CoreOS Enterprise Docker в миксе... Поэтому для меня было важно добавить корпоративные DNS-серверы с хост-машины, чтобы получите VM также для работы.

замена/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

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

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

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

CMD "sh" "-c" "echo nameserver 8.8.8.8 > /etc/resolv.conf"

кроме того, просто добавление серверов имен с хоста (в моем случае mac osx ) в vm docker-machine решает проблему.


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

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

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

nmcli dev show | grep IP4.DNS

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

DOCKER_OPTS="--dns 192.168.50.1"

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


в моем случае проблема в том, что 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.