Không thể cài đặt gói pip bên trong bộ chứa docker với Ubuntu


85

Tôi đang làm theo hướng dẫn bằng hình vẽ để sử dụng docker với ứng dụng python, nhưng khi docker nhận được lệnh

RUN pip install -r requirements.txt

Tôi nhận được thông báo lỗi sau:

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/

Điều này lặp lại vài lần và sau đó tôi nhận được một thông báo khác:

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

Vì vậy, vì một số lý do mà pip không thể truy cập vào bất kỳ gói nào từ bên trong bộ chứa docker. Có điều gì tôi cần làm để cho phép nó truy cập internet không?

Tuy nhiên, pip hoạt động tốt khi cài đặt những thứ bên ngoài vùng chứa docker và hoạt động tốt ngay cả với gói chính xác đó ( blinker==1.3) nên đó không phải là vấn đề. Ngoài ra, vấn đề này không dành riêng cho gói đó. Tôi gặp vấn đề tương tự với bất kỳ pip installlệnh nào cho bất kỳ gói nào.

Có ai có bất kỳ ý tưởng những gì đang xảy ra ở đây?


Phiên bản pip trong vùng chứa docker của bạn là gì? Bạn đã thử docker run mycontainer pip install -r requirements.pipbên ngoài ngữ cảnh vả chưa? Tuy nhiên, nó có vẻ như là một vấn đề về phiên bản pip. Đối với một số phiên bản pip mới hơn, bạn cần chỉ định thêm một số tùy chọn dòng lệnh khi chạy pip installđể nó tìm thấy các gói nhất định.
Torsten Engelbrecht

Dockerfile của tôi có FROM python:2.7nên nó sẽ là bất kỳ phiên bản nào của pip đi kèm với python 2.7.9. Tôi chưa thử chạy các lệnh pip một cách riêng biệt nhưng đó là vì tôi thậm chí không thể tạo vùng chứa vì pip không hoạt động. Tôi có thể thử tạo một thùng chứa python trống và thử nghiệm điều đó khi tôi có cơ hội
Migwell

1
Có thể bạn có thể thử pip install --no-use-wheel --allow-all-external -r requirements.piphoặc nếu điều đó không giúp ích gì thì hãy thử pip install --no-use-wheel --allow-all-external --allow-unverified blinker -r requirements.pip. Điều đó đã làm việc cho tôi trong quá khứ khi tôi gặp một lỗi tương tự pip install. Ngoài ra, bạn có thể thử xóa dòng đó khỏi DockerFile và sau đó xây dựng vùng chứa mà không có nó để kiểm tra xem lệnh có thể thực thi sau đó hay không. Như đã nói, tôi không nghĩ đó là vấn đề ở đây.
Torsten Engelbrecht

Bạn có thể thêm đối số trong khi chạy "docker build -t <app name>. --Network = host"
abhishek kumar

Câu trả lời:


60

Vấn đề của bạn xuất phát từ thực tế là Docker không sử dụng máy chủ DNS thích hợp. Bạn có thể sửa nó theo ba cách khác nhau:

1. Thêm Google DNS vào cấu hình cục bộ của bạn

Sửa đổi /etc/resolv.conf và thêm các dòng sau vào cuối

# Google IPv4 nameservers nameserver 8.8.8.8 nameserver 8.8.4.4

Nếu bạn muốn thêm các máy chủ DNS khác, hãy xem tại đây .

Tuy nhiên, thay đổi này sẽ không phải là vĩnh viễn (xem chủ đề này ). Để đặt nó vĩnh viễn: $ sudo nano /etc/dhcp/dhclient.conf Bỏ ghi chú và chỉnh sửa dòng với tên miền-tên-máy chủ thêm trước: prepend domain-name-servers 8.8.8.8, 8.8.4.4;

Khởi động lại dhclient: $ sudo dhclient.

2. Sửa đổi cấu hình Docker

Như đã giải thích trong tài liệu :

Hệ thống chạy Ubuntu hoặc dẫn xuất Ubuntu trên máy tính để bàn thường sử dụng 127.0.0.1 làm máy chủ định danh mặc định trong tệp /etc/resolv.conf.

Để chỉ định một máy chủ DNS để Docker sử dụng:

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. Sử dụng một tham số khi bạn chạy Docker

Khi bạn chạy docker, chỉ cần thêm thông số sau: --dns 8.8.8.8


1
Tôi đã thiết lập dns trong docker -omp, và nó vẫn không hoạt động. Bất kỳ ý tưởng?
ismailsunni

14
được rồi, khởi động lại docker-máy của tôi là giải quyết được sự cố. thanks
ismailsunni

1
Nó hoạt động với tôi sau khi thêm Google DNS vào cấu hình cục bộ nhưng không chỉ định máy chủ DNS trong tệp cấu hình Docker (nó không hoạt động nếu tôi làm vậy). Tôi đang sử dụng Ubuntu 14.04, với Docker 1.12.2
minhduc

Theo như tôi biết, --dnscờ chỉ có sẵn trên dockerlệnh. Tôi chưa thể tìm thấy phần mềm tương đương cho Docker-Compose.
Sebastialonso

26

Tôi cần thêm --network = host vào lệnh xây dựng docker của mình:

docker build --network=host -t image_name .

2
Cái này làm việc cho tôi nếu tôi phải thay đổi bất kỳ thứ gì trong máy ảo Ubuntu 19.10 của tôi (được tạo bằng tính năng tạo nhanh Hyper-V chạy trên Window 10)
Wlad

22

Tôi đã gặp vấn đề tương tự và nó đã làm tôi khó chịu trong một thời gian và tôi đã thử rất nhiều giải pháp trực tuyến nhưng không có kết quả. Tuy nhiên, cuối cùng tôi đã giải quyết nó như sau:

Đang chạy:

Ubuntu 16.04 
docker Server 18.03.0-ce
  1. Khám phá địa chỉ máy chủ DNS của bạn.

    Khám phá địa chỉ máy chủ DNS của bạn bằng cách chạy lệnh sau:

    $: nmcli dev show | grep 'IP4.DNS'
    IP4.DNS[1]:                192.168.210.2
    
  2. Cập nhật trình nền Docker

    Tạo tệp cấu hình docker tại /etc/docker/daemon.json.( nếu bạn chưa có ) và thêm nội dung sau vào tệp:

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

    Mục đầu tiên của mảng là máy chủ DNS của mạng của bạn và mục thứ hai là máy chủ DNS của google làm dự phòng khi DNS của mạng của bạn không khả dụng.

    Lưu tệp và sau đó khởi động lại dịch vụ docker

    $: sudo service docker restart
    

2
Điều này đã giải quyết vấn đề của tôi với docker-ce. Lưu ý: Tôi không có tệp daemon.json. Có thể tệp đó không được tạo theo mặc định trong khi cài đặt và bạn cần phải tạo nó theo cách thủ công.
floatingpurr

2
Đây là thứ duy nhất hoạt động với tôi trên Ubuntu 18.04.1. Tôi có thể tìm thấy 2 DNS từ lệnh nmcli và đưa cả hai vào daemon.json.
Newalp

Nó là thứ duy nhất làm việc cho tôi trên Ubuntu 18.04.2. Giải pháp đã được đề xuất trước đó trong bài đăng này bởi câu trả lời từ dekauliya
PatriceG

Nó đã làm việc. Ngoài ra, giải pháp này là cách ít xâm nhập hơn phần còn lại. Cảm ơn bạn!
Sebastialonso

Làm việc trên CentOS 7. Cảm ơn bạn !!
schoon

16

được rồi, khởi động lại docker-máy của tôi là giải quyết được sự cố. cảm ơn - ismailsunni

Đây là giải pháp cho tôi:

docker-machine restart <machine-name>

1
Đối với những người bạn đang sử dụng Windows và không chắc đối số <machine-name> nên như thế nào: Tôi vừa mở PowerShell và chạy docker-machine restartvà sau đó docker-machine env(như nó đã nhắc tôi) và nó đã khắc phục được sự cố.
Nathan Wailes

15

Đối với tôi chỉ đơn giản là khởi động lại trình nền docker đã giúp.

service docker restart

8

Đối với người dùng Ubuntu

Bạn cần thêm địa chỉ DNS mới trong cấu hình docker

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

Thêm dns sau ExecStar.

--dns 10.252.252.252 --dns 10.253.253.253

Nên trông như thế:

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

Sau đó làm:

systemctl daemon-reload
sudo service docker restart

Nên làm việc.


1
Đây là giải pháp duy nhất đã làm việc cho tôi. Ubuntu 16.04, Docker 17.03.1-ce.
Simon Arsenault

2
Làm việc trên Ubuntu 16.04 không có gì khác giúp.
Shanky

Tôi không thể khởi động docker sau điều này: docker.service: Không thành công với kết quả 'mã thoát'.
davegallant

2
Có điều gì đặc biệt về 10.252.252.252 và 10.253.253.253. Tôi đang chạy Ubuntu 16.04Docker 17.09.0-cevà điều này không hoạt động
Tối đa

1
Không hoạt động trên Ubuntu 18.04.2 LTS và Docker 18.06.1-ce
PatriceG

6

Trong trường hợp của tôi, với docker version 1.13.0docker-machine 0.9.0dưới Ubuntu 16.04tôi đã phải sửa đổi một chút câu trả lời của Tanzaho (2. Sửa đổi cấu hình Docker) như sau:

  1. Đăng nhập vào Ubuntu với tư cách người dùng có đặc quyền sudo.

  2. Mở tệp / etc / default / docker để chỉnh sửa:

    sudo vim /etc/default/docker
    
  3. Thêm cài đặt sau cho Docker.

    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
    
  4. Lưu và đóng tập tin.

  5. Khởi động lại daemon Docker:

    sudo service docker restart
    

6

Trong trường hợp ai đó đang đọc nó bằng cách sử dụng docker-compile. Tôi đã giải quyết vấn đề này bằng cách thay đổi tệp yaml của mình như sau

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

tương đương với viết

docker build . --network host

5

Đối với tôi, tôi không thể cài đặt pip do DNS của docker không được định cấu hình đúng cách. Tôi đã thử các bước trên, tuy nhiên, việc định cấu hình DNS của docker thành Google DNS không hoạt động đối với máy tính xách tay của tôi. DNS của Docker chỉ có thể được định cấu hình đúng nếu tôi đặt DNS của nó thành IP được chỉ định của máy tính xách tay của tôi.

Nếu bạn sử dụng Ubuntu, bạn có thể sử dụng các bước sau để định cấu hình DNS của docker của bạn:

  1. Tìm ra IP được chỉ định của thiết bị của bạn. Bạn có thể tìm thấy điều này bằng cách

    • Kiểm tra addr inet của ethernet hoặc wlan của bạn trong ifconfig
    • Chọn bất kỳ địa chỉ nào trong nmcli dev show | grep 'DNS'
  2. Chỉnh sửa dns trong /etc/docker/daemon.json(tạo tệp này nếu nó chưa tồn tại trước đó)

    {
        "dns": ["your_ip_in_step_1"]
    }
    
  3. Khởi động lại docker: sudo service docker restart


Cũng làm việc cho tôi. Nó dường như là giải pháp áp dụng cho các phiên bản docker mới hơn. Để biết chi tiết, hãy xem askubuntu.com/a/790778/776407
Stefan Sieber

4

Là một người mới Docker, tôi đã gặp sự cố tự biểu hiện theo cách này khi tôi làm theo hướng dẫn dành cho Docker tại:

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

Tôi đang sử dụng Docker 17.03.1-ce trên mạng LAN công ty.

Tôi đã kiểm tra và kiểm tra kỹ cài đặt DNS của mình. Tôi đã sử dụng nhiều cách khác nhau để định cấu hình DNS mà tôi đã tìm thấy trong các tìm kiếm của mình trên Internet. Một số gây ra lỗi khi khởi động. Phương pháp cuối cùng mà tôi đã giải quyết để định cấu hình DNS là phương pháp trong phần Khắc phục sự cố Linux của liên kết ở trên, nơi DNS được định cấu hình thông qua tệp daemon.json trong thư mục / etc / docker.

Tuy nhiên, tôi vẫn gặp vấn đề tương tự. Điều cuối cùng đã giải quyết được vấn đề cho tôi là cấu hình proxy thông qua các biến môi trường http_proxy và https_proxy . Tôi đã chỉ định chúng trong Dockerfile của mình, nhưng tôi đã sơ ý làm như vậy trước lệnh pip RUN.

Mặc dù nó có vẻ là một vấn đề DNS, việc di chuyển các lệnh ENV này lên trước lệnh RUN đã tạo ra sự khác biệt cho tôi. Trong trường hợp đó là hữu ích cho bất kỳ ai có vấn đề này.


Đây là giải pháp duy nhất làm việc cho tôi. Cảm ơn!!
msingh

3

Tôi không biết lý do, nhưng lỗi có nghĩa là pip đang cố gắng giải quyết /simple/blinker/dưới dạng tên máy chủ DNS thay vì pypi.python.orgmột phần, điều này có vẻ rất kỳ lạ vì tôi thậm chí không thể tìm ra bất kỳ URL nào urlparsecó thể trả về một chuỗi như tên máy chủ. phần. Tôi sẽ kiểm tra xem có vấn đề gì với~/.pip/pip.conf


3

Tôi đã gặp vấn đề tương tự. Nguyên nhân của lỗi là proxy.

Vì vậy, tôi chỉnh sửa Dockerfile sau

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

Nó đã hoạt động trong trường hợp của tôi. Cần phải xóa [user: passwd @] khỏi tùy chọn proxy, tùy chọn này là tùy chọn theo tài liệu pip: --proxy <proxy>: Chỉ định proxy ở dạng [user: passwd @] proxy.server: port.
Alex Javarotti 12/09/19

3

Đối với tôi, đó là do được kết nối với VPN của trường đại học của tôi. Ngắt kết nối "đã giải quyết" vấn đề.


1

Định cấu hình DNS của docker thành Google DNS (8.8.8.8) hoặc 10.0.0.2 không hoạt động trong môi trường công ty của tôi.

Đang chạy: $ khoan @ 8.8.8.8 www.amazon.com hoặc @ 10.0.0.2 đã xác nhận điều này.

Để tìm một DNS hoạt động, tôi đã chạy: $ khoan www.amazon.com và nó đã cung cấp cho tôi IP DNS đang được sử dụng trong mạng của tôi.

Sau đó, tôi đặt nó trong Ubuntu bằng bước sau để định cấu hình DNS của docker.

Đã thay đổi dns trong /etc/docker/daemon.json

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

Restart docker: sudo service docker restart

Tôi đang ở trong tình huống tương tự nhưng giải pháp dường như không hiệu quả với tôi. Các thùng chứa của tôi vẫn không thể kết nối với Internet bên ngoài
harpratap

1

Tôi mới sử dụng Docker và đã thử tất cả các phương pháp được đề cập ở đây, nhưng vẫn không hiểu đúng. phiên bản Docker là 18 và phiên bản ubuntu là 16. Tôi đã thử phương pháp này: - Đầu tiên tôi đang xây dựng docker với mạng internet của công ty. mạng này đang chặn một số trang web hoặc một số cách mọi thứ không diễn ra tốt đẹp ở đây. Vì vậy, thứ hai là tôi đã kết nối với mạng của chính mình (ví dụ như tôi đang sử dụng trong điện thoại di động) và đã thử. mọi thứ diễn ra đúng như vậy. request.txt đã được cài đặt thành công và docker đã được xây dựng.


0

Hãy để nó chạy. Đôi khi pypi đang gặp sự cố kết nối khiến bạn nghĩ rằng nó đã bị hỏng. Để chắc chắn, hãy để nó lăn, bạn có thể thấy nó tự hoạt động.

Dòng dưới cùng, bất chấp những dòng lỗi màu đỏ này, là "Đã tạo thành công"

$ 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.