Не удается установить пакеты pip внутри контейнера докеров с Ubuntu

86

Я следую руководству fig по использованию докера с приложением python, но когда докер подбирается к команде

RUN pip install -r requirements.txt

Я получаю следующее сообщение об ошибке:

Step 3 : RUN pip install -r requirements.txt
 ---> Running in fe0b84217ad1
Collecting blinker==1.3 (from -r requirements.txt (line 1))
  Retrying (Retry(total=4, connect=None, read=None, redirect=None)) after connection broken by 'ProtocolError('Connection aborted.', gaierror(-2, 'Name or service not known'))': /simple/blinker/

Это повторяется несколько раз, а затем я получаю еще одно сообщение:

Could not find any downloads that satisfy the requirement blinker==1.3 (from -r requirements.txt (line 1))
  No distributions at all found for blinker==1.3 (from -r requirements.txt (line 1))

Поэтому по какой-то причине pip не может получить доступ к каким-либо пакетам из контейнера докеров. Что мне нужно сделать, чтобы разрешить ему доступ в Интернет?

Однако pip отлично работает для установки вещей за пределами контейнера докеров и отлично работает даже с этим точным package ( blinker==1.3), так что это не проблема. Также эта проблема не относится к этому пакету. У меня такая же проблема с любой pip installкомандой для любого пакета.

Кто-нибудь знает, что здесь происходит?

Migwell
источник
Какая версия pip в вашем докер-контейнере? А вы docker run mycontainer pip install -r requirements.pipвне фигового контекста пробовали ? Тем не менее, похоже, что это проблема с версией pip. Для некоторых более новых версий pip вам нужно указать дополнительные параметры командной строки при запуске, pip installчтобы он нашел определенные пакеты.
Торстен Энгельбрехт
В моем файле dockerfile есть FROM python:2.7какая-то версия pip, которая поставляется с python 2.7.9. Я не пробовал запускать команды pip отдельно, но это потому, что я даже не могу собрать контейнер, поскольку pip не работает. Я мог бы попробовать сделать пустой контейнер для питона и протестировать его, когда у меня будет возможность
Мигвелл
1
Может быть, вы можете попробовать, pip install --no-use-wheel --allow-all-external -r requirements.pipили, если это не поможет, попробуйте pip install --no-use-wheel --allow-all-external --allow-unverified blinker -r requirements.pip. Это работало для меня в прошлом, когда у меня была похожая ошибка с pip install. Также вы можете попытаться удалить эту строку из DockerFile, а затем построить контейнер без нее, чтобы проверить, может ли команда выполняться впоследствии. Как уже было сказано, я не думаю, что здесь проблема.
Торстен Энгельбрехт
Вы можете добавить аргумент при запуске "docker build -t <app name>. --Network = host"
abhishek kumar

Ответы:

60

Ваша проблема связана с тем, что Docker не использует правильный DNS-сервер. Вы можете исправить это тремя разными способами:

1. Добавление Google DNS в вашу локальную конфигурацию

Изменение /etc/resolv.conf и добавление следующих строк в конце

# Google IPv4 nameservers nameserver 8.8.8.8 nameserver 8.8.4.4

Если вы хотите добавить другие DNS-серверы, посмотрите здесь .

Однако это изменение не будет постоянным (см. Эту ветку ). Чтобы сделать его постоянным: $ sudo nano /etc/dhcp/dhclient.conf раскомментируйте и отредактируйте строку с добавлением сервера доменного имени: prepend domain-name-servers 8.8.8.8, 8.8.4.4;

Перезапуск dhclient: $ sudo dhclient.

2. Изменение конфигурации Docker

Как объяснено в документах :

Системы, которые запускают Ubuntu или производную Ubuntu на рабочем столе, обычно используют 127.0.0.1 в качестве сервера имен по умолчанию в файле /etc/resolv.conf.

Чтобы указать DNS-сервер для использования Docker:

1. Log into Ubuntu as a user with sudo privileges.

2. Open the /etc/default/docker file for editing :

    $ sudo nano /etc/default/docker

3. Add the following setting for Docker.

    DOCKER_OPTS="--dns 8.8.8.8"

4. Save and close the file.

5. Restart the Docker daemon :

    $ sudo systemctl restart docker

3. Использование параметра при запуске Docker

Когда вы запускаете докер, просто добавьте следующий параметр: --dns 8.8.8.8

Танзахо
источник
1
Я установил DNS в docker-compose, но он все еще не работает. Есть идеи?
ismailsunni
14
Хорошо, перезапуск моей докер-машины решает проблему. спасибо
ismailsunni
1
У меня это сработало после добавления Google DNS в локальную конфигурацию, но без указания DNS-сервера в файле конфигурации Docker (если я это сделал, это не сработало). Я использую Ubuntu 14.04 с Docker 1.12.2
minhduc
Насколько я знаю, --dnsфлаг доступен только по dockerкоманде. Я пока не могу найти аналог для Docker-Compose.
Sebastialonso
26

Мне нужно было добавить --network = host в мою команду сборки докера:

docker build --network=host -t image_name .
Дэн Хук
источник
2
ЭТО сработало для меня без необходимости что-либо менять в моей виртуальной машине Ubuntu 19.10 (которая была создана с помощью быстрого создания Hyper-V, работающего в Windows 10)
Влад
22

У меня была такая же проблема, и она беспокоила меня некоторое время, и я пробовал много решений в Интернете, но безрезультатно. Однако я наконец решил это следующим образом:

Бег:

Ubuntu 16.04 
docker Server 18.03.0-ce
  1. Узнайте адрес вашего DNS-сервера.

    Узнайте адрес своего DNS-сервера, выполнив следующую команду:

    $: nmcli dev show | grep 'IP4.DNS'
    IP4.DNS[1]:                192.168.210.2
    
  2. Обновите демон Docker

    Создайте файл конфигурации докера /etc/docker/daemon.json.( если у вас его еще нет ) и добавьте в файл следующее содержимое:

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

    Первый элемент массива - это DNS-сервер вашей сети, а второй - DNS-сервер Google в качестве запасного варианта, если DNS вашей сети недоступен.

    Сохраните файл, а затем перезапустите службу докеров.

    $: sudo service docker restart
    
пимиси
источник
2
Это решило мою проблему с docker-ce. Примечание: у меня не было файла daemon.json. Вероятно, этот файл не создается по умолчанию при установке, и вам нужно создать его вручную.
Floatingpurr
2
Это единственное, что у меня сработало в Ubuntu 18.04.1. Я смог найти 2 DNS с помощью команды nmcli и включил оба в daemon.json.
Newalp
Это единственное, что у меня сработало на Ubuntu 18.04.2. Решение было предложено ранее в этом посте ответом dekauliya
PatriceG
Это сработало. Кроме того, это решение менее навязчиво, чем остальные. Спасибо!
Себастьяльонсо
Работал на CentOS 7. Спасибо !!
шхуна
16

Хорошо, перезапуск моей докер-машины решает проблему. спасибо - ismailsunni

Для меня это было решением:

docker-machine restart <machine-name>
Орлук
источник
1
Для тех из вас, кто использует Windows и не уверен, каким должен быть аргумент <machine-name>: я просто открыл PowerShell и запустил его, docker-machine restartа затем docker-machine env(как он меня побуждал), и проблема была устранена.
Nathan Wailes
15

Мне помог простой перезапуск docker daemon.

service docker restart
Bartoszer
источник
8

Для пользователей Ubuntu

Вам нужно добавить новые адреса DNS в конфиг докера

sudo nano /lib/systemd/system/docker.service

Добавьте DNS после ExecStar.

--dns 10.252.252.252 --dns 10.253.253.253

Должно получиться так:

ExecStart=/usr/bin/dockerd -H fd:// --dns 10.252.252.252 --dns 10.253.253.253

Затем сделайте:

systemctl daemon-reload
sudo service docker restart

Должно сработать.

Броски
источник
1
Это единственное решение, которое сработало для меня. Ubuntu 16.04, Docker 17.03.1-ce.
Саймон Арсено
2
Больше ничего не помогло при работе над Ubuntu 16.04.
Shanky 06
После этого я не могу запустить докер: docker.service: Ошибка с результатом «код выхода».
davegallant
2
Есть ли что-нибудь особенное в 10.252.252.252 и 10.253.253.253? Я использую Ubuntu 16.04Docker, 17.09.0-ceи это не работает
Макс
1
Не работает на Ubuntu 18.04.2 LTS и Docker 18.06.1-ce
PatriceG
6

В моем случае с docker version 1.13.0и docker-machine 0.9.0под Ubuntu 16.04мне пришлось немного изменить ответ Танзахо (2. Изменение конфигурации Docker) следующим образом:

  1. Войдите в Ubuntu как пользователь с привилегиями sudo.

  2. Откройте файл / etc / default / docker для редактирования:

    sudo vim /etc/default/docker
    
  3. Добавьте следующий параметр для Docker.

    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
    
  4. Сохраните и закройте файл.

  5. Перезапустите демон Docker:

    sudo service docker restart
    
вабада
источник
6

Если кто-то читает это, используя docker-compose. Мне удалось решить эту проблему, изменив файл yaml следующим образом

version: 3.4
service: my-app
  build:
  context: .
  network: host

что эквивалентно написанию

docker build . --network host
Люк Престон
источник
5

Для меня мне не удалось установить pip из-за неправильной настройки DNS докера. Я пробовал описанные выше шаги, однако настройка Docker DNS на Google DNS не работает для моего ноутбука. DNS Docker можно правильно настроить, только если я настрою его DNS на IP-адрес, назначенный моему ноутбуку.

Если вы используете Ubuntu, вы можете использовать следующие шаги для настройки DNS вашего докера:

  1. Узнайте назначенный IP-адрес вашего устройства. Вы можете найти это либо

    • Проверка inet-адреса вашего Ethernet или WLAN в ifconfig
    • Выбирая любой адрес в nmcli dev show | grep 'DNS'
  2. Отредактируйте dns в /etc/docker/daemon.json(создайте этот файл, если он не существует ранее)

    {
        "dns": ["your_ip_in_step_1"]
    }
    
  3. Перезагрузите докер: sudo service docker restart

декаулия
источник
У меня тоже сработало. Похоже, это решение применимо к более новым версиям докеров. Подробнее см. Askubuntu.com/a/790778/776407
Стефан Зибер,
4

Как новичок в Docker, у меня возникла проблема, которая проявлялась таким образом, когда я следил за учебником по Docker по адресу:

https://docs.docker.com/get-started/part2

Я использую Docker 17.03.1-ce в корпоративной локальной сети.

Я проверил и дважды проверил свои настройки DNS. Я использовал различные способы настройки DNS, которые я нашел при поиске в Интернете. Некоторые вызывали ошибки при запуске. Подход, который я в конечном итоге выбрал для настройки DNS, был описан в разделе «Устранение неполадок Linux» указанной выше ссылки, где DNS настраивается через файл daemon.json в каталоге / etc / docker.

Однако у меня все еще была такая же проблема. Что в конечном итоге решило проблему для меня, так это настройка прокси-сервера через переменные среды http_proxy и https_proxy . У меня они были указаны в моем Dockerfile, но я не сделал этого до команды RUN pip.

Несмотря на то, что это казалось проблемой DNS, перемещение этих команд ENV перед командой RUN имело для меня значение. В случае, если это полезно для тех, у кого есть эта проблема.

Деон МакКланг
источник
Это единственное решение, которое у меня сработало. Благодаря!!
msingh
3

Я не знаю причины, но ошибка означает, что pip пытается разрешить /simple/blinker/как имя хоста DNS, а не pypi.python.orgчасть, что кажется очень странным, так как я даже не могу придумать какой-либо URL-адрес, для которого urlparseможно было бы вернуть такую ​​строку как имя хоста часть. Я бы проверил, есть ли проблемы с~/.pip/pip.conf

Антти Хаапала
источник
3

У меня была такая же проблема. Причина ошибки - прокси.

Итак, я редактирую Dockerfile, следуя

RUN pip install -r /app/requirements.txt --proxy=http://user:pass@addr:port
HH
источник
В моем случае это сработало. Было необходимо удалить опцию [user: passwd @] из прокси, которая не является обязательной согласно документации по pip: --proxy <proxy>: укажите прокси в форме [user: passwd @] proxy.server: port.
Alex Javarotti
3

Для меня это было вызвано подключением к моей университетской VPN. Отключение "решило" проблему.

p0wl
источник
1

Настройка docker DNS на Google DNS (8.8.8.8) или 10.0.0.2 не работала в среде моей компании.

Запуск: $ Drill @ 8.8.8.8 www.amazon.com или @ 10.0.0.2 подтвердили это.

Чтобы найти работающий DNS, я запустил: $ Drill www.amazon.com, и он дал мне IP-адрес DNS, который используется в моей сети.

Затем я установил его в Ubuntu, используя следующий шаг для настройки DNS докеров.

Изменен DNS в /etc/docker/daemon.json

{
    "dns": ["the DNS ip from step1"]
}

Restart docker: sudo service docker restart
Томас
источник
Я в той же ситуации, но решение, похоже, не работает для меня. Мои контейнеры по-прежнему не могут подключиться к внешнему Интернету
harpratap
1

Я новичок в Docker и пробовал все методы, упомянутые здесь, но все еще не понял. версия Docker была 18, а версия ubuntu - 16. Я попробовал этот метод: - Сначала я собирал докер с интернет-сетью компании. эта сеть блокирует некоторые сайты или что-то здесь как-то не ладится. Итак, во-вторых, я подключился к своей собственной сети (которую я использую, например, в мобильном телефоне) и попробовал. все пошло хорошо. require.txt был успешно установлен, и docker был собран.

Пиял Джордж
источник
0

Пусть работает. Иногда у pypi возникают проблемы с подключением, которые шумно бросаются вам в лицо, чтобы вы думали, что он сломан. Чтобы быть уверенным, дайте ему поработать, вы можете обнаружить, что он сам справится.

Итог, несмотря на эти красные строки ошибок, - «Успешно построено».

$ docker build .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM docker-registry.aws.example.com:5000/cmcrc/python2:20160517120608
 ---> 1e5034711aa9
Step 2 : RUN pip install prometheus-client requests
 ---> Running in f3c580fc93ae
Collecting prometheus-client
  Retrying (Retry(total=4, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.HTTPConnection object at 0x7fe15a1d8610>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/prometheus-client/
  Retrying (Retry(total=3, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.HTTPConnection object at 0x7fe15a1d87d0>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/prometheus-client/
  Retrying (Retry(total=2, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.HTTPConnection object at 0x7fe15a1d8990>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/prometheus-client/
  Retrying (Retry(total=1, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.HTTPConnection object at 0x7fe15a1d8b50>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/prometheus-client/
  Retrying (Retry(total=0, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.HTTPConnection object at 0x7fe15a1d8d10>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/prometheus-client/
  Downloading prometheus_client-0.0.13.tar.gz
Collecting requests
  Retrying (Retry(total=4, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.HTTPConnection object at 0x7fe159e9d4d0>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/requests/
  Retrying (Retry(total=3, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.HTTPConnection object at 0x7fe159e9da10>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/requests/
  Retrying (Retry(total=2, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.HTTPConnection object at 0x7fe159e9dc50>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/requests/
  Retrying (Retry(total=1, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.HTTPConnection object at 0x7fe159e9de10>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/requests/
  Retrying (Retry(total=0, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.HTTPConnection object at 0x7fe159e9dfd0>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/requests/
  Downloading requests-2.10.0-py2.py3-none-any.whl (506kB)
Building wheels for collected packages: prometheus-client
  Running setup.py bdist_wheel for prometheus-client: started
  Running setup.py bdist_wheel for prometheus-client: finished with status 'done'
  Stored in directory: /root/.cache/pip/wheels/04/94/f5/b803b2ff65e8344e99ca99b7f7cb8194224017167809a32b78
Successfully built prometheus-client
Installing collected packages: prometheus-client, requests
Successfully installed prometheus-client-0.0.13 requests-2.10.0
 ---> 19c5e3cfe08f
Removing intermediate container f3c580fc93ae
Successfully built 19c5e3cfe08f
Джон Ми
источник