Неможливо встановити пакунки pip всередині контейнера докера за допомогою Ubuntu


86

Я слідую керівництву по фігу щодо використання docker з додатком python, але коли docker підходить до команди

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 чудово працює, щоб встановлювати речі поза контейнером докера, і працював нормально навіть із цим blinker==1.3самим пакетом ( ), тому це не проблема. Також ця проблема не характерна для цього пакета. Я отримую однакову проблему з будь-якою pip installкомандою для будь-якого пакета.

Хтось уявляє, що тут відбувається?


Яка версія pip у вашому контейнері докера? Ви пробували docker run mycontainer pip install -r requirements.pipпоза контекстом фіга? Тим не менше, це звучить як проблема у піп-версії. Для деяких новіших версій піп вам потрібно вказати ще кілька параметрів командного рядка під час запуску, pip installщоб він знаходив певні пакети.
Торстен Енгельбрехт

У моєму докер-файлі є, 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 <назва програми>. --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.
Себастіалонсо,

26

Мені потрібно було додати --network = host до моєї команди побудови docker:

docker build --network=host -t image_name .

2
ЦЕ одна працювала для мене без необхідності щось міняти у моїй віртуальній машині Ubuntu 19.10 (яка була створена за допомогою швидкого створення Hyper-V, що працює у вікні 10)
Wlad

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.
Ньюальп,

Це єдине, що працювало у мене на Ubuntu 18.04.2. Рішення було запропоновано раніше в цій публікації відповіддю від dekauliya
PatriceG

Це спрацювало. Також це рішення є менш нав'язливим, ніж інші. Дякую!
Себастіалонсо,

Працював над CentOS 7. Дякую !!
schoon

16

добре, перезапуск моєї докер-машини вирішує проблему. дякую - ismailsunni

Це було рішення для мене:

docker-machine restart <machine-name>

1
Для тих з вас, хто використовує Windows і не знає, яким повинен бути аргумент <ім'я машини>: я просто відкрив PowerShell і запустив, docker-machine restartа потім docker-machine env(як це мене підказало) і вирішив проблему.
Nathan Wailes


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, більше нічого не допомогло.
Шенкі

Я не можу запустити docker після цього: 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мені довелося трохи змінити відповідь Tanzaho (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 докера. Я спробував описані вище дії, однак, налаштування 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
Stefan Sieber

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

У моєму випадку це спрацювало. Потрібно було видалити [user: passwd @] з опції проксі, яка є необов’язковою відповідно до документації pip: --proxy <proxy>: Вкажіть проксі у формі [user: passwd @] proxy.server: port.
Алекс Джаваротті,

3

Для мене це було спричинено підключенням до мого університетського VPN. Відключення "вирішило" проблему.


1

Налаштування 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, і він дав мені DNS-IP, який використовується в моїй мережі.

Потім я встановив його в 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. Я спробував цей метод: - Спочатку я будував докер з мережею Інтернету компанії. ця мережа блокує деякі веб-сайти або те, як тут не все йшло добре. Отже, по-друге, я підключився до своєї власної мережі (яку я використовую, наприклад, у мобільному телефоні) і спробував. справи пішли правильно. требование.txt було успішно встановлено, а докер створено.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.