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
.