Ubuntu를 사용하여 Docker 컨테이너 내에 pip 패키지를 설치할 수 없습니다.


86

나는 파이썬 응용 프로그램에서 도커를 사용 하는 무화과 가이드 를 따르고 있지만 커가 명령에 도달하면

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모든 패키지에 대한 명령 과 동일한 문제가 발생 합니다.

여기에서 무슨 일이 일어나고 있는지 아는 사람이 있습니까?


Docker 컨테이너의 pip 버전은 무엇입니까? docker run mycontainer pip install -r requirements.pip무화과 컨텍스트 밖에서 시도 했습니까 ? 그래도 pip 버전 문제처럼 들립니다. 일부 최신 pip 버전의 경우 실행할 때 더 많은 명령 줄 옵션을 지정 pip install하여 특정 패키지를 찾습니다.
Torsten Engelbrecht

내 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. 과거에는 .NET과 유사한 오류가 발생했을 때 저에게 효과적 pip install이었습니다. 또한 DockerFile에서 해당 줄을 제거한 다음 명령이 나중에 실행할 수 있는지 테스트하기 위해 컨테이너없이 컨테이너를 빌드 할 수도 있습니다. 말했듯이, 나는 그것이 여기서 문제라고 생각하지 않습니다.
Torsten Engelbrecht

실행하는 동안 당신은 인수를 추가 할 수 있습니다 "고정 표시기 빌드 -t에게 <응용 프로그램 이름> --network = 호스트."
abhishek 쿠마

답변:


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 주석 처리를 제거하고 domain-name-server 앞에 추가 된 줄을 편집합니다. prepend domain-name-servers 8.8.8.8, 8.8.4.4;

dhclient 다시 시작 : $ sudo dhclient.

2. Docker 구성 수정

문서에 설명 된 대로 :

데스크탑에서 Ubuntu 또는 Ubuntu 파생물을 실행하는 시스템은 일반적으로 /etc/resolv.conf 파일에서 기본 이름 서버로 127.0.0.1을 사용합니다.

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
좋아, 내 도커 머신을 다시 시작하면 문제가 해결됩니다. 감사
ismailsunni

1
Google DNS를 로컬 구성에 추가했지만 Docker 구성 파일에 DNS 서버를 지정하지 않고 저에게 효과적이었습니다 (그렇다면 작동하지 않았습니다). Docker 1.12.2와 함께 Ubuntu 14.04를 사용하고 있습니다
minhduc

내가 아는 한 --dns플래그는 docker명령 에서만 사용할 수 있습니다 . 아직 Docker-Compose에 해당하는 것을 찾을 수 없습니다.
Sebastialonso

26

도커 빌드 명령에 --network = host를 추가해야했습니다.

docker build --network=host -t image_name .

2
이 방법은 Ubuntu 19.10 VM (Windows 10에서 실행되는 Hyper-V 빠른 만들기로 생성됨)에서 아무것도 변경하지 않고도 저에게 효과적이었습니다.
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 서버입니다.

    파일을 저장 한 다음 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

효과가있었습니다. 또한이 솔루션은 나머지 솔루션보다 덜 방해가됩니다. 감사합니다!
Sebastialonso

CentOS 7에서 작업했습니다. 감사합니다 !!
스쿤

16

좋아, 내 도커 머신을 다시 시작하면 문제가 해결됩니다. 감사합니다 – ismailsunni

이것이 나를위한 해결책이었습니다.

docker-machine restart <machine-name>

1
Windows를 사용하고 있고 <machine-name> 인수가 무엇인지 확실하지 않은 사람들을 위해 : 방금 PowerShell을 열고 실행 docker-machine restart한 다음 docker-machine env(내가 요청한대로) 문제를 해결했습니다.
Nathan Wailes 2018

15

나를 위해 단순히 docker 데몬을 다시 시작하는 것이 도움이되었습니다.

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.
Simon Arsenault

2
Ubuntu 16.04에서 작업하는 것은 도움이되지 않았습니다.
Shanky

이 후 docker를 시작할 수 없습니다. docker.service : 'exit-code'결과로 실패했습니다.
davegallant

2
10.252.252.252 및 10.253.253.253에 대해 특별히 특별한 것이 있습니까? Ubuntu 16.04Docker를 실행하고 있는데 작동 17.09.0-ce하지 않습니다
Max

1
우분투 18.04.2 LTS와 도커에 18.06.1-CE 작동하지 않았다
PatriceG

6

내 경우에는,로 docker version 1.13.0docker-machine 0.9.0에서 Ubuntu 16.04나는 다음과 같이 약간 Tanzaho의 대답 (2 수정 도커의 설정)를 수정했습니다 :

  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
    

6

누군가가 docker-compose를 사용하여 이것을 읽는 경우. 다음과 같이 내 yaml 파일을 변경하여이 문제를 해결했습니다.

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

쓰기와 동일

docker build . --network host

5

나를 위해 도커의 DNS가 제대로 구성되지 않아 pip를 설치할 수 없었습니다. 위의 단계를 시도했지만 Docker DNS를 Google DNS로 구성하는 것은 내 노트북에서 작동하지 않습니다. Docker의 DNS는 DNS를 랩톱의 할당 된 IP로 설정 한 경우에만 올바르게 구성 할 수 있습니다.

Ubuntu를 사용하는 경우 다음 단계를 사용하여 Docker의 DNS를 구성 할 수 있습니다.

  1. 장치에 할당 된 IP를 찾으십시오. 다음 중 하나를 통해 찾을 수 있습니다.

    • 이더넷 또는 WLAN의 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


나를 위해 일했습니다. 최신 도커 버전에 적용되는 솔루션 인 것 같습니다. 자세한 내용은 askubuntu.com/a/790778/776407
Stefan Sieber를

4

Docker 초보자로서 Docker에 대한 자습서를 따를 때 이런 식으로 나타나는 문제가있었습니다.

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

회사 LAN에서 Docker 17.03.1-ce를 사용하고 있습니다.

DNS 설정을 확인하고 두 번 확인했습니다. 인터넷 검색에서 찾은 DNS를 구성하는 다양한 방법을 사용했습니다. 일부는 시작시 오류를 일으켰습니다. DNS 구성을 위해 최종적으로 결정한 접근 방식은 위 링크의 Linux 문제 해결 섹션에서 DNS가 / etc / docker 디렉토리의 daemon.json 파일을 통해 구성되는 방식입니다.

그러나 나는 여전히 똑같은 문제가 있었다. 마지막으로 문제를 해결 한 것은 http_proxy 및 https_proxy 환경 변수를 통한 프록시 구성이었습니다 . Dockerfile에 지정했지만 RUN pip 명령 전에 지정하지 않았습니다.

DNS 문제인 것처럼 보였지만 이러한 ENV 명령을 RUN 명령보다 먼저 이동하면 차이가 생겼습니다. 이 문제가있는 사람에게 도움이되는 경우.


이것은 나를 위해 일한 유일한 솔루션입니다. 감사!!
msingh 2010 년

3

이유를 모르겠지만 오류는 pip가 부분 /simple/blinker/대신 DNS 호스트 이름으로 해결하려고 시도하고 있음을 의미합니다 pypi.python.org. 이는 urlparse호스트 이름과 같은 문자열을 반환 할 수 있는 URL을 찾을 수도 없기 때문에 매우 이상하게 보입니다. 부품. 문제가 있는지 확인하겠습니다.~/.pip/pip.conf


3

나는 같은 문제가 있었는데 오류의 원인은 프록시입니다.

그래서 Dockerfile을 다음과 같이 편집합니다.

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

제 경우에는 효과가있었습니다. pip 문서에 따라 선택 사항 인 프록시 옵션에서 [user : passwd @]를 제거해야했습니다. --proxy <proxy> : [user : passwd @] proxy.server : port 형식으로 프록시를 지정합니다.
Alex Javarotti

3

저에게는 대학 VPN에 연결되어 있었기 때문입니다. 연결을 끊으면 문제가 "해결"되었습니다.


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이고 우분투 버전은 16입니다.이 방법을 시도했습니다.-먼저 회사의 인터넷 네트워크로 Docker를 구축했습니다. 이 네트워크는 일부 사이트를 차단하거나 여기에서 일이 잘되지 않는 방법을 보여줍니다. 그래서 두 번째로 나는 내 자신의 네트워크 (예 : 휴대 전화에서 사용)에 연결하여 시도했습니다. 일이 잘되었습니다. requirements.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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.