不能用 Ubuntu 在 docker 容器中安装 pip 软件包

我遵循 无花果指南的思想,在 python 应用程序中使用 docker,但是当 docker 到达命令时

RUN pip install -r requirements.txt

I get the following error message:

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 无法从码头集装箱内访问任何包裹。我需要做什么才能让它上网吗?

However pip works fine to install things outside of the docker container, and worked fine even with that exact package (blinker==1.3) so that's not the problem. Also this problem isn't specific to that package. I get the same issue with any pip install command for any package.

Does anyone have any idea what's going on here?

134340 次浏览

我不知道原因,但错误意味着 pip 正试图解析 /simple/blinker/作为 DNS 主机名,而不是 pypi.python.org部分,这似乎很奇怪,因为我甚至不能找到任何 URL,urlparse可以返回这样的字符串作为主机名部分。我要检查一下 ~/.pip/pip.conf是否有问题

您的问题来自于 Docker 没有使用正确的 DNS 服务器这一事实。 You can fix it in three different ways :

1. Adding Google DNS to your local config

修改/etc/Resolv.conf 并在末尾添加以下代码行

# Google IPv4名称服务器 名称服务器8.8.8.8 域名服务器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;

Restart dhclient : $ sudo dhclient.

2. Modifying Docker config

作为 在文件中解释过:

Systems that run Ubuntu or an Ubuntu derivative on the desktop typically use 127.0.0.1 as the default nameserver in /etc/resolv.conf file.

指定供 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

好的,重新启动我的码头机正在解决这个问题。谢谢-ismailsunni

这就是我的解决办法:

docker-machine restart <machine-name>

对我来说,重新启动 Docker 守护进程很有帮助。

service docker restart

让它跑。有时候 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

在我的例子中,在 Ubuntu 16.04下的 docker version 1.13.0docker-machine 0.9.0,我不得不稍微修改一下坦桑霍的答案(2。修改 Docker 配置)如下:

  1. 以拥有 sudo 权限的用户身份登录 Ubuntu。

  2. 打开/etc/default/docker 文件进行编辑:

    sudo vim /etc/default/docker
    
  3. Add the following setting for Docker.

    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
    
  4. Save and close the file.

  5. Restart the Docker daemon :

    sudo service docker restart
    

对 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

Then do:

systemctl daemon-reload
sudo service docker restart

应该可以。

对我来说,我无法安装 pip 由于码头的 DNS 配置不正确。我已经尝试了上面的步骤,但是,配置 DNS 到谷歌 DNS 不适合我的笔记本电脑。只有当我将 Docker 的 DNS 设置为我的笔记本电脑分配的 IP 时,才能正确配置它的 DNS。

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

  1. 找出你的设备的分配 IP。你可以找到这个

    • ifconfig中检查以太网或无线局域网的 inetaddr
    • nmcli dev show | grep 'DNS'中选择任意地址
  2. Edit dns in /etc/docker/daemon.json (create this file if it doesn't exist previously)

    {
    "dns": ["your_ip_in_step_1"]
    }
    
  3. Restart docker: sudo service docker restart

I had same problem.The cause of error is proxy.

因此,我编辑 Dockerfile 如下

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

Configuring docker DNS to Google DNS (8.8.8.8) or 10.0.0.2 did not work in my company environment.

电子邮件: $drill@8.8.8.8 www.amazon.com or@10.0.0.2。

为了找到一个可行的 DNS,我运行: $Drill www.amazon.com 它给了我正在我的网络中使用的 DNS IP。

Then I set it in Ubuntu using the following step to configure docker's DNS.

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

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


Restart docker: sudo service docker restart

我有同样的问题,它困扰了我一段时间,我尝试了很多解决方案,但无济于事。然而,我最终解决了这个问题:

跑步:

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. Update the Docker daemon

    Create a docker config file at /etc/docker/daemon.json. (if you don't already have one) and add the following content to the file:

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

    数组的第一个项目是您的网络的 DNS 服务器,第二个是谷歌的 DNS 服务器作为备用时,如果您的网络的 DNS 是不可用的。

    Save the file and then restart the docker service

    $: sudo service docker restart
    

作为一个 Docker 的新手,当我学习 Docker 的教程时,我遇到了这样一个问题:

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

我在公司局域网上用 Docker 17.03.1-ce。

我反复检查了我的 DNS 设置。我使用了各种方法来配置我在互联网上搜索到的 DNS。有些在启动时引起错误。我最终选择的配置 DNS 的方法是上面链接的疑难解答 Linux 部分中的方法,其中 DNS 是通过/etc/docker 目录中的 daemon.json 文件配置的。

However, I still had this same issue. What finally solved the problem for me was the configuration of the proxy via the http_proxy and https_proxy environment variables. I had them specified in my Dockerfile, but I neglected to do so before the RUN pip command.

尽管它看起来是一个 DNS 问题,但是将这些 ENV 命令移动到 RUN 命令之前对我来说有很大的不同。以防这对任何有这个问题的人有帮助。

我刚接触 Docker,尝试了这里提到的所有方法,但仍然没有得到正确的。Docker 版本是18,ubuntu 版本是16。我尝试了这个方法:-首先我是建立与公司的互联网网络码头。这个网络屏蔽了一些网站或者一些事情进展得不太顺利的地方。因此,第二,我连接到我自己的网络(例如,在移动电话中使用) ,并尝试。一切都很顺利。Txt 安装成功,并且构建了 docker。

对我来说,这是由于连接到我的大学 VPN 造成的。断开连接“解决”了这个问题。

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

docker build --network=host -t image_name .

如果有人正在使用 docker-compose 阅读这个文件,我通过修改 yaml 文件来解决这个问题,如下所示

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

which is equivalent to writing

docker build . --network host

我猜您试图在不允许从公共回购直接访问/安装的私有环境中运行 pip install。如果是这样的话,您可以将—— index-url 和—— trust-host 添加到 requments.txt 中,如下所示:

要求:

--index-url https://pypi.internal.org/api/pypi/org.python.pypi/simple
--trusted-host pypi.internal.org pypi.python.org pypi.org files.pythonhosted.org
blinker==1.3

对我来说,这是因为我在 VPN 和多克无法找到我的私人 PYPI 路线。如果需要继续使用 VPN,请使用 docker build --network=host

DR

更新 docker 守护进程的默认 MTU。

  1. ip link获取物理接口的 MTU。
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1480 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 72:bd:50:24:5e:a9 brd ff:ff:ff:ff:ff:ff
  1. 创建 /etc/docker/daemon.json并输入物理接口的 MTU 值:
{
"mtu": 1480
}
  1. Restart the docker service:
sudo service docker restart

解释

我在 Linux 虚拟机上运行 docker 时也遇到了同样的问题。设置 -network=host解决了这个问题,但不是一个令人满意的解决方案,因为我不知道 为什么它的工作。

经过几个小时的搜索,我发现这个问题是由于容器中物理接口的 MTU 和虚拟接口的 MTU 不匹配造成的。虚拟接口的 MTU 必须小于或等于物理接口上 MTU 的大小,否则容器将无法接收大于物理 MTU 大小的数据包。

In my case, the physical interface (VM) was configured with an MTU of 1480. Docker's default MTU is 1500.

对于 pip,问题表现为 SSL 握手停滞(未能读取服务器 hello) ,从而导致重复的 ReadTimeout错误。

这个问题描述为 给你,尽管我使用的解决方案描述为 给你