无法在使用Ubuntu的docker容器中安装pip包

Mig*_*ell 63 python pip docker fig

我正在按照无花果指南使用带有python应用程序的docker,但是当docker启动命令时

RUN pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

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/
Run Code Online (Sandbox Code Playgroud)

这重复几次,然后我收到另一条消息:

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))
Run Code Online (Sandbox Code Playgroud)

所以由于某种原因,pip无法访问docker容器内的任何包.有什么我需要做的,以允许它上网?

然而,pip可以很好地在docker容器之外安装东西,并且即使使用那个确切的package(blinker==1.3)也能正常工作,这样就不是问题了.此问题也不是特定于该包.我pip install对任何包的任何命令都有同样的问题.

有谁知道这里发生了什么?

Tan*_*aho 53

你的问题来自于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
Run Code Online (Sandbox Code Playgroud)

3.运行Docker时使用参数

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

  • 好的,重新启动我的docker-machine正在解决问题.谢谢 (13认同)
  • 在将 Google DNS 添加到本地配置后,它对我有用,但没有在 Docker 配置文件中指定 DNS 服务器(如果我这样做,它就不起作用)。我正在使用 Ubuntu 14.04 和 Docker 1.12.2 (2认同)
  • 据我所知,“--dns”标志仅在“docker”命令上可用。我还找不到 Docker-Compose 的等效项。 (2认同)

小智 18

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

运行:

Ubuntu 16.04 
docker Server 18.03.0-ce
Run Code Online (Sandbox Code Playgroud)
  1. 发现DNS服务器的地址.

    运行以下命令,发现DNS服务器的地址:

    $: nmcli dev show | grep 'IP4.DNS'
    IP4.DNS[1]:                192.168.210.2
    
    Run Code Online (Sandbox Code Playgroud)
  2. 更新Docker守护程序

    创建一个docker配置文件/etc/docker/daemon.json.(如果您还没有)并将以下内容添加到该文件中:

    {
        "dns": ["192.168.210.2", "8.8.8.8"]
    }
    
    Run Code Online (Sandbox Code Playgroud)

    如果您的网络的DNS不可用,则阵列的第一项是您的网络的DNS服务器,第二项是谷歌的DNS服务器作为后备.

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

    $: sudo service docker restart
    
    Run Code Online (Sandbox Code Playgroud)

  • 这解决了我的`docker-ce`问题。注意:我没有`daemon.json`文件。默认情况下,该文件可能不是在安装过程中默认创建的,您需要手动创建它。 (2认同)
  • 这是在Ubuntu 18.04.1。上对我唯一有效的方法。我可以从nmcli命令中找到2个DNS,并将它们都包含在daemon.json中。 (2认同)

orl*_*uke 16

好的,重新启动我的docker-machine正在解决问题.谢谢 - ismailsunni

这是我的解决方案:

docker-machine restart <machine-name>
Run Code Online (Sandbox Code Playgroud)


小智 10

对我来说,只需重启docker守护进程帮助.

service docker restart
Run Code Online (Sandbox Code Playgroud)


Dan*_*ook 10

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

docker build --network=host -t image_name .
Run Code Online (Sandbox Code Playgroud)

  • 这个对我有用,无需更改我的 Ubuntu 19.10 VM 中的任何内容(该 VM 是使用在 Window 10 上运行的 Hyper-V 快速创建创建的) (2认同)

小智 9

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

version: 3.4
service: my-app
  build:
  context: .
  network: host
Run Code Online (Sandbox Code Playgroud)

这相当于写作

version: 3.4
service: my-app
  build:
  context: .
  network: host
Run Code Online (Sandbox Code Playgroud)


小智 7

对于Ubuntu用户

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

sudo nano /lib/systemd/system/docker.service
Run Code Online (Sandbox Code Playgroud)

在ExecStar之后添加dns.

--dns 10.252.252.252 --dns 10.253.253.253
Run Code Online (Sandbox Code Playgroud)

看起来应该是这样的:

ExecStart=/usr/bin/dockerd -H fd:// --dns 10.252.252.252 --dns 10.253.253.253
Run Code Online (Sandbox Code Playgroud)

然后做:

systemctl daemon-reload
sudo service docker restart
Run Code Online (Sandbox Code Playgroud)

应该管用.

  • 在Ubuntu 16.04上工作没有任何其他帮助. (2认同)
  • 10.252.252.252和10.253.253.253有什么特别之处吗?我正在运行Ubuntu`16.04`Docker`17.09.0-ce`,但这不起作用 (2认同)

son*_*207 6

对我来说,这是因为我在 VPN 上,而 docker 找不到我的私人 PYPI 路由。如果您需要继续使用 VPNdocker build --network=host


vab*_*ada 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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 为Docker添加以下设置。

    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
    
    Run Code Online (Sandbox Code Playgroud)
  4. 保存并关闭文件。

  5. 重新启动Docker守护进程:

    sudo service docker restart
    
    Run Code Online (Sandbox Code Playgroud)


dek*_*iya 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"]
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 重新启动docker: sudo service docker restart


H.H*_*H.H 5

我遇到了同样的问题。错误原因是代理。

所以,我编辑 Dockerfile 以下

RUN pip install -r /app/requirements.txt --proxy=http://user:pass@addr:port
Run Code Online (Sandbox Code Playgroud)


Ant*_*ala 4

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