Nie można zainstalować pakietów pip w kontenerze Dockera w systemie Ubuntu

86

Postępuję zgodnie z przewodnikiem rys, aby używać dockera z aplikacją w języku Python, ale kiedy docker dostanie się do polecenia

RUN pip install -r requirements.txt

Otrzymuję następujący komunikat o błędzie:

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/

Powtarza się to kilka razy, a następnie otrzymuję kolejną wiadomość:

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

Więc z jakiegoś powodu pip nie może uzyskać dostępu do żadnych pakietów z kontenera Dockera. Czy jest coś, co muszę zrobić, aby umożliwić mu dostęp do Internetu?

Jednak pip działa dobrze, aby zainstalować rzeczy poza kontenerem docker i działał dobrze nawet z tym dokładnym pakietem ( blinker==1.3), więc to nie jest problem. Również ten problem nie jest specyficzny dla tego pakietu. Ten sam problem występuje z każdym pip installpoleceniem dla dowolnego pakietu.

Czy ktoś ma pojęcie, co się tutaj dzieje?

Migwell
źródło
Jaka jest wersja pip w kontenerze Docker? Czy próbowałeś docker run mycontainer pip install -r requirements.pipwyjść poza kontekst figowy? Mimo to brzmi to jak problem z wersją pip. W przypadku niektórych nowszych wersji pip potrzebujesz, więc określ więcej opcji wiersza poleceń podczas uruchamiania, pip installaby znaleźć określone pakiety.
Torsten Engelbrecht
Mój plik dockerfile ma, FROM python:2.7więc będzie to dowolna wersja pip, która zawiera Python 2.7.9. Nie próbowałem uruchamiać poleceń pip oddzielnie, ale to dlatego, że nie mogę nawet zbudować kontenera, ponieważ pip nie działa. Mogę spróbować zrobić pusty kontener Pythona i przetestować go, gdy będę miał okazję
Migwell,
1
Może możesz spróbować, pip install --no-use-wheel --allow-all-external -r requirements.pipa jeśli to nie pomoże, spróbuj pip install --no-use-wheel --allow-all-external --allow-unverified blinker -r requirements.pip. To działało w przeszłości, kiedy miałem podobny błąd z pip install. Możesz również spróbować usunąć ten wiersz z DockerFile, a następnie skompilować kontener bez niego, aby sprawdzić, czy polecenie może zostać wykonane później. Jak już powiedziano, nie sądzę, że o to chodzi.
Torsten Engelbrecht
Możesz dodać argument podczas uruchamiania "docker build -t <nazwa aplikacji>. --Network = host"
abhishek kumar

Odpowiedzi:

60

Twój problem wynika z faktu, że Docker nie używa właściwego serwera DNS. Możesz to naprawić na trzy różne sposoby:

1. Dodanie Google DNS do konfiguracji lokalnej

Modyfikacja /etc/resolv.conf i dodanie na końcu następujących linii

# Google IPv4 nameservers nameserver 8.8.8.8 nameserver 8.8.4.4

Jeśli chcesz dodać inne serwery DNS, zajrzyj tutaj .

Jednak ta zmiana nie będzie trwała (zobacz ten wątek ). Aby stała się trwała: $ sudo nano /etc/dhcp/dhclient.conf Odkomentuj i edytuj wiersz z przedrostkiem nazwa-domeny-serwera: prepend domain-name-servers 8.8.8.8, 8.8.4.4;

Restart dhclient: $ sudo dhclient.

2. Modyfikowanie konfiguracji Dockera

Jak wyjaśniono w dokumentach :

Systemy z systemem Ubuntu lub pochodną Ubuntu na pulpicie zazwyczaj używają 127.0.0.1 jako domyślnego serwera nazw w pliku /etc/resolv.conf.

Aby określić serwer DNS do użytku przez Docker:

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. Użycie parametru podczas uruchamiania Dockera

Po uruchomieniu dockera po prostu dodaj następujący parametr: --dns 8.8.8.8

Tanzaho
źródło
1
Ustawiłem dns w docker-compose i nadal nie działa. Dowolny pomysł?
ismailsunni
14
ok, ponowne uruchomienie mojej maszyny docker rozwiązuje problem. dzięki
ismailsunni
1
U mnie zadziałało po dodaniu Google DNS do lokalnej konfiguracji, ale bez określenia serwera DNS w pliku konfiguracyjnym Dockera (nie zadziałało, jeśli to zrobię). Używam Ubuntu 14.04, z Dockerem 1.12.2
minhduc
O ile wiem, --dnsflaga jest dostępna tylko na dockerkomendzie. Nie mogę jeszcze znaleźć odpowiednika dla Docker-Compose.
Sebastialonso
26

Musiałem dodać --network = host do mojego polecenia kompilacji docker:

docker build --network=host -t image_name .
Dan Hook
źródło
2
Ten działał dla mnie bez konieczności zmiany czegokolwiek w mojej maszynie wirtualnej Ubuntu 19.10 (która została utworzona za pomocą szybkiego tworzenia Hyper-V działającego w systemie Windows 10)
Wład
22

Miałem ten sam problem i nękał mnie przez jakiś czas i próbowałem wielu rozwiązań online, ale bezskutecznie. Jednak ostatecznie rozwiązałem to w następujący sposób:

Bieganie:

Ubuntu 16.04 
docker Server 18.03.0-ce
  1. Odkryj adres swojego serwera DNS.

    Odkryj adres swojego serwera DNS, uruchamiając następujące polecenie:

    $: nmcli dev show | grep 'IP4.DNS'
    IP4.DNS[1]:                192.168.210.2
    
  2. Zaktualizuj demona platformy Docker

    Utwórz plik konfiguracyjny Dockera w /etc/docker/daemon.json.( jeśli jeszcze go nie masz ) i dodaj następującą zawartość do pliku:

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

    Pierwszą pozycją w tablicy jest serwer DNS Twojej sieci, a drugą jest serwer DNS Google jako rezerwę, gdy DNS Twojej sieci jest niedostępny.

    Zapisz plik, a następnie uruchom ponownie usługę Docker

    $: sudo service docker restart
    
pimisi
źródło
2
To rozwiązało mój problem z docker-ce. Uwaga: nie miałem pliku daemon.json. Prawdopodobnie ten plik nie jest tworzony domyślnie podczas instalacji i musisz go utworzyć ręcznie.
floatingpurr
2
To jedyna rzecz, która działała dla mnie na Ubuntu 18.04.1. Mogłem znaleźć 2 DNS z polecenia nmcli i zawrzeć oba w daemon.json.
Newalp
To jedyna rzecz, która działała dla mnie na Ubuntu 18.04.2. Rozwiązanie zostało zaproponowane wcześniej w tym poście w odpowiedzi od dekauliya
PatriceG
Zadziałało. Również to rozwiązanie jest znacznie mniej uciążliwe niż pozostałe. Dziękuję Ci!
Sebastialonso
Pracowałem nad CentOS 7. Dziękuję !!
szkun
16

ok, ponowne uruchomienie mojej maszyny dokującej rozwiązuje problem. dzięki - ismailsunni

To było dla mnie rozwiązanie:

docker-machine restart <machine-name>
orluke
źródło
1
Dla tych z Was, którzy używają systemu Windows i nie są pewni, jaki powinien być argument <nazwa maszyny>: właśnie otworzyłem PowerShell i uruchomiłem, docker-machine restarta następnie docker-machine env(tak jak mnie o to poprosił) i naprawiłem problem.
Nathan Wailes
15

U mnie pomogło po prostu ponowne uruchomienie demona dockera.

service docker restart
Bartoszer
źródło
8

Dla użytkowników Ubuntu

Musisz dodać nowe adresy DNS w konfiguracji Dockera

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

Dodaj nazwy DNS po ExecStar.

--dns 10.252.252.252 --dns 10.253.253.253

Powinien wyglądać tak:

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

Następnie wykonaj:

systemctl daemon-reload
sudo service docker restart

Powinno działać.

Broski
źródło
1
To jedyne rozwiązanie, które mi się sprawdziło. Ubuntu 16.04, Docker 17.03.1-ce.
Simon Arsenault
2
Praca nad Ubuntu 16.04 nic więcej nie pomogła.
Shanky
Po tym nie mogę uruchomić dockera: docker.service: Błąd z wynikiem „kod zakończenia”.
davegallant
2
Czy jest coś szczególnego w 10.252.252.252 i 10.253.253.253. Używam Ubuntu 16.04Docker 17.09.0-cei to nie działa
maks.
1
Nie działa na Ubuntu 18.04.2 LTS i Docker 18.06.1-ce
PatriceG
6

W moim przypadku, ze docker version 1.13.0i docker-machine 0.9.0pod Ubuntu 16.04musiałem zmodyfikować nieco odpowiedź Tanzaho'S (2. Modyfikacja Docker config) w następujący sposób:

  1. Zaloguj się do Ubuntu jako użytkownik z uprawnieniami sudo.

  2. Otwórz plik / etc / default / docker do edycji:

    sudo vim /etc/default/docker
    
  3. Dodaj następujące ustawienie dla platformy Docker.

    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
    
  4. Zapisz i zamknij plik.

  5. Zrestartuj demona Dockera:

    sudo service docker restart
    
vabada
źródło
6

Na wypadek, gdyby ktoś to czytał, używając docker-compose. Udało mi się rozwiązać ten problem, zmieniając plik yaml w następujący sposób

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

co jest równoznaczne z pisaniem

docker build . --network host
Luke Preston
źródło
5

Dla mnie nie mogłem zainstalować pip z powodu nieprawidłowego skonfigurowania DNS dockera. Wypróbowałem powyższe kroki, jednak konfiguracja Dockera DNS na Google DNS nie działa na moim laptopie. DNS Dockera można poprawnie skonfigurować tylko wtedy, gdy ustawię jego DNS na adres IP przypisany do mojego laptopa.

Jeśli używasz Ubuntu, możesz wykonać następujące kroki, aby skonfigurować DNS swojego dockera:

  1. Sprawdź przypisany adres IP urządzenia. Możesz to znaleźć w obu

    • Sprawdzanie adresu inet Twojej sieci Ethernet lub sieci WLAN ifconfig
    • Wybierając dowolny adres w nmcli dev show | grep 'DNS'
  2. Edytuj dns w /etc/docker/daemon.json(utwórz ten plik, jeśli wcześniej nie istniał)

    {
        "dns": ["your_ip_in_step_1"]
    }
    
  3. Uruchom ponownie okno dokowane: sudo service docker restart

dekauliya
źródło
Dla mnie też zadziałał. Wydaje się, że jest to rozwiązanie, które dotyczy nowszych wersji dockera. Aby uzyskać szczegółowe informacje, patrz askubuntu.com/a/790778/776407
Stefan Sieber
4

Jako nowicjusz Dockera miałem problem, który objawiał się w ten sposób, gdy korzystałem z samouczka dla Dockera pod adresem:

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

Używam Dockera 17.03.1-ce w firmowej sieci LAN.

Sprawdziłem i dwukrotnie sprawdziłem moje ustawienia DNS. Używałem różnych sposobów konfiguracji DNS, które znalazłem podczas moich wyszukiwań w Internecie. Niektóre powodowały błędy podczas uruchamiania. Podejście, które ostatecznie wybrałem do konfiguracji DNS, było takie, które zostało opisane w sekcji Rozwiązywanie problemów z systemem Linux w powyższym linku, gdzie DNS jest konfigurowany za pośrednictwem pliku daemon.json w katalogu / etc / docker.

Jednak nadal miałem ten sam problem. To, co ostatecznie rozwiązało dla mnie problem, to konfiguracja proxy poprzez zmienne środowiskowe http_proxy i https_proxy . Miałem je określone w moim pliku Dockerfile, ale zaniedbałem to zrobić przed poleceniem RUN pip.

Mimo że wydawało się, że jest to problem z DNS, przeniesienie tych poleceń ENV przed polecenie RUN miało dla mnie różnicę. Na wypadek, gdyby było to pomocne dla każdego, kto ma ten problem.

Deon McClung
źródło
To jedyne rozwiązanie, które u mnie zadziałało. Dzięki!!
msingh
3

Nie znam przyczyny, ale błąd oznacza, że ​​pip próbuje rozwiązać /simple/blinker/jako nazwę hosta DNS zamiast pypi.python.orgczęści, co wydaje się bardzo dziwne, ponieważ nie mogę nawet wymyślić żadnego adresu URL, dla którego urlparsemógłby zwrócić taki ciąg jako nazwę hosta część. Sprawdzę, czy jest jakiś problem~/.pip/pip.conf

Antti Haapala
źródło
3

Miałem ten sam problem Przyczyną błędu jest proxy.

Więc edytuję następujący plik Dockerfile

RUN pip install -r /app/requirements.txt --proxy=http://user:pass@addr:port
HH
źródło
W moim przypadku zadziałało. Konieczne było usunięcie opcji [użytkownik: hasło @] z proxy, która jest opcjonalna zgodnie z dokumentacją pip: --proxy <proxy>: Podaj proxy w postaci [użytkownik: hasło @] proxy.server: port.
Alex Javarotti
3

W moim przypadku było to spowodowane połączeniem z siecią VPN mojej uczelni. Odłączenie „rozwiązało” problem.

p0wl
źródło
1

Konfiguracja Docker DNS na Google DNS (8.8.8.8) lub 10.0.0.2 nie działała w moim środowisku firmowym.

Bieganie: $ drill @ 8.8.8.8 www.amazon.com lub @ 10.0.0.2 potwierdziły to.

Aby znaleźć działający DNS, uruchomiłem: $ drill www.amazon.com i dostałem adres IP DNS, który jest używany w mojej sieci.

Następnie ustawiłem go w Ubuntu, wykonując następujący krok, aby skonfigurować DNS dockera.

Zmieniono dns w /etc/docker/daemon.json

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

Restart docker: sudo service docker restart
Tomas
źródło
Jestem w takiej samej sytuacji, ale wydaje mi się, że rozwiązanie nie działa. Moje kontenery nadal nie mogą połączyć się z zewnętrznym Internetem
harpratap
1

Jestem nowy w Docker i wypróbowałem wszystkie wymienione tutaj metody, ale nadal nie udało mi się. Wersja Dockera to 18, a Ubuntu 16. Wypróbowałem tę metodę: - Najpierw budowałem docker z firmową siecią internetową. ta sieć blokuje niektóre witryny lub coś tutaj nie poszło dobrze. Po drugie połączyłem się z własną siecią (której używam na przykład w telefonie komórkowym) i spróbowałem. wszystko poszło dobrze. Require.txt została pomyślnie zainstalowana, a docker został skompilowany.

Piyal George
źródło
0

Pozwól mu działać. Czasami pypi ma problemy z połączeniem, które są hałaśliwie rzucane na twoją twarz, abyś pomyślał, że jest zepsuty. Dla pewności, pozwól mu się toczyć, może się okazać, że działa sam.

Najważniejsze, pomimo tych czerwonych linii błędów, brzmi „Zbudowano pomyślnie”

$ 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
John Mee
źródło