无法使用Ubuntu在Docker容器内安装pip软件包


80

我遵循无花果指南,将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无法从docker容器内部访问任何软件包。我需要做些什么才能允许它访问互联网吗?

但是pip在docker容器之外安装东西的效果很好,即使使用了确切的package(blinker==1.3)也能正常工作,所以这不是问题。同样,此问题并非特定于该软件包。我pip install对任何软件包的任何命令都遇到相同的问题。

有人知道这是怎么回事吗?


您的Docker容器中的pip版本是什么?您是否尝试docker run mycontainer pip install -r requirements.pip过无花果上下文?不过,这听起来像是点子版本的问题。对于某些较新的pip版本,您需要在运行时指定其他命令行选项,pip install以便找到某些软件包。
Torsten Engelbrecht 2015年

我的dockerfile具有FROM python:2.7python 2.7.9随附的pip版本。我没有尝试单独运行pip命令,但这是因为pip无法正常工作,我什至无法构建容器。我可能会尝试做一个空的容器,蟒蛇和测试,当我得到这个机会
Migwell

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中删除该行,然后构建没有该行的容器,以测试命令是否可以在此后执行。如前所述,我认为这不是问题所在。
Torsten Engelbrecht 2015年

您可以在运行“ docker build -t <应用程序名称>。--network = host”时添加参数
Abhishek kumar

Answers:


59

您的问题来自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-server编辑该行: 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文件中的默认名称服务器。

要指定供Docker使用的DNS服务器:

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时使用参数

运行docker时,只需添加以下参数: --dns 8.8.8.8


1
我已经在docker-compose中设置了dns,但仍然无法正常工作。任何的想法?
ismailsunni

14
好的,重新启动我的docker-machine可以解决问题。谢谢
ismailsunni 2015年

1
在将Google DNS添加到本地配置后,但没有在Docker配置文件中指定DNS服务器的情况下,它为我工作(如果这样做,则不起作用)。我正在使用带有Docker 1.12.2的Ubuntu 14.04
minhduc

据我所知,该--dns标志仅在docker命令上可用。我还找不到Docker-Compose的等效产品。
Sebastialonso

23

我需要在我的docker build命令中添加--network = host:

docker build --network=host -t image_name .

2
这个对我
有用

21

我遇到了同样的问题,困扰了我一段时间,我在网上尝试了很多解决方案,但无济于事。但是我终于解决了如下问题:

运行:

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.如果您还没有)创建一个docker配置文件,并将以下内容添加到该文件中:

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

    数组的第一项是您网络的DNS服务器,第二项是Google的DNS服务器,如果网络的DNS不可用,则作为备用。

    保存文件,然后重新启动docker服务

    $: sudo service docker restart
    

2
这解决了我的问题docker-ce。注意:我没有文件daemon.json。默认情况下,该文件可能不是在安装过程中默认创建的,您需要手动创建它。
floatingpurr

2
这是在Ubuntu 18.04.1。上对我唯一有效的方法。我可以从nmcli命令中找到2个DNS,并将它们都包含在daemon.json中。
Newalp

这是唯一在Ubuntu 18.04.2。上对我有用的东西。该解决方案是由dekauliya
PatriceG '19

有效。同样,该解决方案比其他解决方案更具侵入性。谢谢!
Sebastialonso

在CentOS 7上工作。谢谢!
schoon

16

好的,重新启动我的docker-machine可以解决问题。谢谢– ismailsunni

这是我的解决方案:

docker-machine restart <machine-name>

1
对于那些使用Windows并不确定<machine-name> arg应该是什么的人:我只是打开PowerShell docker-machine restart,然后运行,然后docker-machine env(因为提示我这样做了),它解决了问题。
内森·威尔斯

15

对我来说,只需重启docker daemon即可。

service docker restart

8

对于Ubuntu用户

您需要在docker配置中添加新的DNS地址

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

在ExecStar之后添加dns。

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

在此之后,我无法启动docker:docker.service:结果“退出代码”失败。
davegallant

2
关于10.252.252.252和10.253.253.253是否有什么特别的地方。我运行Ubuntu16.04泊坞窗17.09.0-ce,这不工作
马克斯

1
在Ubuntu 18.04.2 LTS和Docker 18.06.1-ce上
不起作用

5

在我的情况下,我必须使用docker version 1.13.0docker-machine 0.9.0在下面Ubuntu 16.04稍微修改Tanzaho的答案(2.修改Docker配置),如下所示:

  1. 以具有sudo特权的用户身份登录Ubuntu。

  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
    

5

对我来说,由于docker的DNS配置不正确,我无法安装pip。我已经尝试了上述步骤,但是,将docker DNS配置为Google DNS对我的笔记本电脑不起作用。仅当我将其DNS设置为笔记本电脑的分配IP时,才能正确配置Docker的DNS。

如果使用Ubuntu,则可以使用以下步骤配置Docker的DNS:

  1. 找出设备的分配IP。您可以通过以下任一方式找到它

    • 检查您的以太网或局域网的inet地址 ifconfig
    • 选择中的任何地址 nmcli dev show | grep 'DNS'
  2. 编辑dns /etc/docker/daemon.json(如果以前不存在则创建此文件)

    {
        "dns": ["your_ip_in_step_1"]
    }
    
  3. 重新启动docker: sudo service docker restart


也为我工作。这似乎是适用于较新的Docker版本的解决方案。有关详细信息,请参见askubuntu.com/a/790778/776407
Stefan Sieber

5

如果有人正在使用docker-compose阅读此内容。我设法通过更改以下yaml文件来解决此问题

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

相当于写作

docker build . --network host

4

作为Docker的新手,当我在以下位置阅读Docker教程时,就遇到了这样的问题:

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

我在公司LAN上使用Docker 17.03.1-ce。

我检查并仔细检查了我的DNS设置。我使用了各种方法来配置在Internet搜索中找到的DNS。有些导致启动时出错。我最终选择的用于配置DNS的方法是上述链接的“疑难解答Linux”部分中的一种,其中DNS是通过/ etc / docker目录中的daemon.json文件配置的。

但是,我仍然遇到同样的问题。最终为我解决问题的是通过http_proxy和https_proxy环境变量配置代理。我在Dockerfile中指定了它们,但是在RUN pip命令之前忽略了它们。

尽管这似乎是DNS问题,但将这些ENV命令移到RUN命令之前对我来说却有所不同。万一这对有这个问题的人有帮助。


这是唯一对我有用的解决方案。谢谢!!
MeenakshiSingh

3

我不知道原因,但是错误意味着pip尝试将/simple/blinker/DNS解析为DNS主机名而不是该pypi.python.org部分,这看起来很奇怪,因为我什至无法提供任何urlparse可能返回诸如主机名这样的字符串的URL部分。我会检查一下是否有问题~/.pip/pip.conf


3

对我来说,这是由连接到我的大学VPN引起的。断开连接“解决”问题。


2

我有同样的问题。错误的原因是代理。

所以,我在下面编辑Dockerfile

RUN pip install -r /app/requirements.txt --proxy=http://user:pass@addr:port

就我而言,它奏效了。必须从代理选项中删除[user:passwd @]选项,该选项根据pip文档是可选的:--proxy <proxy>:以[user:passwd @] proxy.server:port的形式指定代理。
Alex Javarotti

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,它为我提供了网络中正在使用的DNS IP。

然后,使用以下步骤在Ubuntu中对其进行设置以配置Docker的DNS。

在/etc/docker/daemon.json中更改了dns

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

Restart docker: sudo service docker restart

我处于相同的情况,但是该解决方案似乎对我不起作用。我的容器仍然无法连接到外部互联网
harpratap

1

我是Docker的新手,尝试了此处提到的所有方法,但仍然做不到。Docker版本是18,而ubuntu版本是16。我尝试了这种方法:-首先,我正在使用公司的互联网构建docker。这个网路封锁了某些网站,或某些情况不佳。因此,第二,我连接到我自己的网络(例如,我在手机中使用的网络)并尝试了。一切顺利。required.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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.