Pip-Pakete können mit Ubuntu nicht in einem Docker-Container installiert werden


84

Ich folge der Anleitung zur Verwendung von Docker mit einer Python-Anwendung, aber wenn Docker den Befehl ausführt

RUN pip install -r requirements.txt

Ich erhalte die folgende Fehlermeldung:

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/

Dies wiederholt sich mehrmals und dann erhalte ich eine weitere Nachricht:

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

Aus irgendeinem Grund kann pip nicht auf Pakete aus einem Docker-Container zugreifen. Muss ich etwas tun, um den Internetzugang zu ermöglichen?

Pip funktioniert jedoch einwandfrei, um Dinge außerhalb des Docker-Containers zu installieren, und funktioniert auch mit genau diesem Paket ( blinker==1.3) einwandfrei, sodass dies nicht das Problem ist. Auch dieses Problem ist nicht spezifisch für dieses Paket. Ich bekomme das gleiche Problem mit jedem pip installBefehl für jedes Paket.

Hat jemand eine Idee, was hier los ist?


Was ist die Pip-Version in Ihrem Docker-Container? Haben Sie es docker run mycontainer pip install -r requirements.pipaußerhalb des Feigenkontexts versucht ? Trotzdem klingt es so, als wäre es ein Problem mit der Pip-Version. Für einige neuere Pip-Versionen müssen Sie daher beim Ausführen weitere Befehlszeilenoptionen angeben, pip installdamit bestimmte Pakete gefunden werden.
Torsten Engelbrecht

Meine Docker-Datei hat FROM python:2.7also die Version von Pip, die mit Python 2.7.9 geliefert wird. Ich habe nicht versucht, Pip-Befehle separat auszuführen, aber das liegt daran, dass ich den Container nicht einmal zum Erstellen bringen kann, da Pip nicht funktioniert. Ich könnte versuchen, einen leeren Python-Container zu
erstellen

1
Vielleicht können Sie es versuchen pip install --no-use-wheel --allow-all-external -r requirements.pipoder wenn das nicht hilft, versuchen Sie es pip install --no-use-wheel --allow-all-external --allow-unverified blinker -r requirements.pip. Das hat bei mir in der Vergangenheit funktioniert, als ich einen ähnlichen Fehler hatte pip install. Sie können auch versuchen, diese Zeile aus der Docker-Datei zu entfernen und dann den Container ohne diese zu erstellen, um zu testen, ob der Befehl anschließend ausgeführt werden kann. Wie gesagt, ich denke nicht, dass das hier das Problem ist.
Torsten Engelbrecht

Sie können Argumente hinzufügen, während Sie "docker build -t <Anwendungsname>. --Network = host"
ausführen

Antworten:


59

Ihr Problem ist darauf zurückzuführen, dass Docker nicht den richtigen DNS-Server verwendet. Sie können das Problem auf drei verschiedene Arten beheben:

1. Hinzufügen von Google DNS zu Ihrer lokalen Konfiguration

Ändern Sie /etc/resolv.conf und fügen Sie am Ende die folgenden Zeilen hinzu

# Google IPv4 nameservers nameserver 8.8.8.8 nameserver 8.8.4.4

Wenn Sie weitere DNS-Server hinzufügen möchten, klicken Sie hier .

Diese Änderung ist jedoch nicht dauerhaft (siehe diesen Thread ). So machen Sie es dauerhaft: $ sudo nano /etc/dhcp/dhclient.conf Kommentieren Sie die Zeile aus und bearbeiten Sie sie mit dem vorangestellten Domain-Name-Server: prepend domain-name-servers 8.8.8.8, 8.8.4.4;

Starten Sie dhclient neu : $ sudo dhclient.

2. Ändern der Docker-Konfiguration

Wie in den Dokumenten erklärt :

Systeme, auf denen Ubuntu oder ein Ubuntu-Derivat auf dem Desktop ausgeführt wird, verwenden normalerweise 127.0.0.1 als Standard-Nameserver in der Datei /etc/resolv.conf.

So geben Sie einen DNS-Server zur Verwendung durch Docker an:

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. Verwenden Sie einen Parameter, wenn Sie Docker ausführen

Wenn Sie Docker ausführen, fügen Sie einfach den folgenden Parameter hinzu: --dns 8.8.8.8


1
Ich habe DNS in Docker-Compose gesetzt, und es funktioniert immer noch nicht. Irgendeine Idee?
ismailsunni

14
ok, ein Neustart meiner Docker-Maschine löst das Problem. danke
ismailsunni

1
Es funktionierte für mich nach dem Hinzufügen von Google DNS zur lokalen Konfiguration, ohne jedoch den DNS-Server in der Docker-Konfigurationsdatei anzugeben (es funktionierte nicht, wenn ich dies tat). Ich benutze Ubuntu 14.04, mit Docker 1.12.2
minhduc

Soweit ich weiß, ist die --dnsFlagge nur auf dockerBefehl verfügbar . Ich kann noch kein Äquivalent für Docker-Compose finden.
Sebastialonso

26

Ich musste --network = host zu meinem Docker-Build-Befehl hinzufügen:

docker build --network=host -t image_name .

2
DIESES funktionierte für mich, ohne dass ich irgendetwas an meiner Ubuntu 19.10-VM ändern musste (die mit Hyper-V Quick Create unter Windows 10 erstellt wurde)
Wlad,

22

Ich hatte das gleiche Problem und es plagte mich eine Weile und ich habe viele Lösungen online ausprobiert, aber ohne Erfolg. Ich habe es jedoch wie folgt gelöst:

Laufen:

Ubuntu 16.04 
docker Server 18.03.0-ce
  1. Ermitteln Sie die Adresse Ihres DNS-Servers.

    Ermitteln Sie die Adresse Ihres DNS-Servers, indem Sie den folgenden Befehl ausführen:

    $: nmcli dev show | grep 'IP4.DNS'
    IP4.DNS[1]:                192.168.210.2
    
  2. Aktualisieren Sie den Docker-Daemon

    Erstellen Sie eine Docker-Konfigurationsdatei unter /etc/docker/daemon.json.( falls Sie noch keine haben ) und fügen Sie der Datei den folgenden Inhalt hinzu:

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

    Das erste Element des Arrays ist der DNS-Server Ihres Netzwerks und das zweite ist der DNS-Server von Google als Ersatz, wenn das DNS Ihres Netzwerks nicht verfügbar ist.

    Speichern Sie die Datei und starten Sie den Docker-Dienst neu

    $: sudo service docker restart
    

2
Dies löste mein Problem mit docker-ce. Hinweis: Ich hatte die Datei nicht daemon.json. Wahrscheinlich wird diese Datei während der Installation nicht standardmäßig erstellt, und Sie müssen sie manuell erstellen.
Floatingpurr

2
Dies ist das einzige, was für mich unter Ubuntu 18.04.1 funktioniert hat. Ich konnte 2 DNS aus dem Befehl nmcli finden und beide in daemon.json enthalten.
Newalp

Es ist das einzige, was für mich unter Ubuntu 18.04.2 funktioniert hat. Die Lösung wurde früher in diesem Beitrag durch die Antwort von dekauliya
PatriceG

Es funktionierte. Auch diese Lösung ist viel weniger aufdringlich als der Rest. Vielen Dank!
Sebastialonso

Arbeitete an CentOS 7. Danke !!
Schoon

16

ok, ein Neustart meiner Docker-Maschine löst das Problem. danke - ismailsunni

Das war die Lösung für mich:

docker-machine restart <machine-name>

1
Für diejenigen unter Ihnen, die Windows verwenden und sich nicht sicher sind, wie das Argument <Maschinenname> lauten soll: Ich habe gerade eine PowerShell geöffnet und ausgeführt docker-machine restartund dann docker-machine env(wie es mich dazu aufgefordert hatte) und das Problem behoben.
Nathan Wailes

15

Für mich hat es geholfen, den Docker-Daemon einfach neu zu starten.

service docker restart

8

Für Ubuntu-Benutzer

Sie müssen neue DNS-Adressen in der Docker-Konfiguration hinzufügen

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

Fügen Sie die DNS nach ExecStar hinzu.

--dns 10.252.252.252 --dns 10.253.253.253

Sollte so aussehen:

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

Dann mach:

systemctl daemon-reload
sudo service docker restart

Sollte arbeiten.


1
Dies ist die einzige Lösung, die für mich funktioniert hat. Ubuntu 16.04, Docker 17.03.1-ce.
Simon Arsenault

2
Unter Ubuntu 16.04 hat nichts weiter geholfen.
Shanky

Danach kann ich Docker nicht mehr starten: docker.service: Fehler mit Ergebnis 'Exit-Code'.
Davegallant

2
Gibt es etwas Besonderes an 10.252.252.252 und 10.253.253.253? Ich verwende Ubuntu 16.04Docker 17.09.0-ceund das funktioniert nicht
Max

1
Funktionierte nicht unter Ubuntu 18.04.2 LTS und Docker 18.06.1-ce
PatriceG

6

In meinem Fall musste ich mit docker version 1.13.0und docker-machine 0.9.0unter Ubuntu 16.04Tanzahos Antwort (2. Ändern der Docker-Konfiguration) wie folgt leicht ändern:

  1. Melden Sie sich bei Ubuntu als Benutzer mit Sudo-Berechtigungen an.

  2. Öffnen Sie die Datei / etc / default / docker zum Bearbeiten:

    sudo vim /etc/default/docker
    
  3. Fügen Sie die folgende Einstellung für Docker hinzu.

    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
    
  4. Speichern und schließen Sie die Datei.

  5. Starten Sie den Docker-Daemon neu:

    sudo service docker restart
    

6

Falls jemand dies mit Docker-Compose liest. Ich konnte dies beheben, indem ich meine yaml-Datei wie folgt änderte

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

das ist gleichbedeutend mit Schreiben

docker build . --network host

5

Ich konnte pip nicht installieren, da das DNS des Dockers nicht richtig konfiguriert war. Ich habe die oben genannten Schritte ausgeführt. Die Konfiguration von Docker-DNS für Google DNS funktioniert jedoch nicht für meinen Laptop. Das DNS von Docker kann nur dann ordnungsgemäß konfiguriert werden, wenn ich das DNS auf die zugewiesene IP meines Laptops eingestellt habe.

Wenn Sie Ubuntu verwenden, können Sie die folgenden Schritte ausführen, um das DNS Ihres Dockers zu konfigurieren:

  1. Finden Sie die zugewiesene IP Ihres Geräts heraus. Sie können dies entweder finden

    • Überprüfen Sie die Inet-Adresse Ihres Ethernet oder WLAN ifconfig
    • Wählen Sie eine beliebige Adresse in nmcli dev show | grep 'DNS'
  2. Bearbeiten Sie DNS in /etc/docker/daemon.json(erstellen Sie diese Datei, wenn sie vorher nicht existiert)

    {
        "dns": ["your_ip_in_step_1"]
    }
    
  3. Docker neu starten: sudo service docker restart


Hat auch für mich gearbeitet. Es scheint die Lösung zu sein, die für neuere Docker-Versionen gilt. Einzelheiten finden Sie unter askubuntu.com/a/790778/776407
Stefan Sieber

4

Als Docker-Neuling hatte ich ein Problem, das sich auf diese Weise manifestierte, als ich dem Tutorial für Docker unter folgender Adresse folgte:

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

Ich verwende Docker 17.03.1-ce in einem Unternehmens-LAN.

Ich habe meine DNS-Einstellungen überprüft und doppelt überprüft. Ich hatte verschiedene Methoden zum Konfigurieren des DNS verwendet, die ich bei meinen Suchvorgängen im Internet gefunden hatte. Einige verursachten beim Start Fehler. Der Ansatz, den ich letztendlich für die Konfiguration des DNS gewählt habe, war der im Abschnitt Fehlerbehebung unter Linux des obigen Links oben, in dem der DNS über die Datei daemon.json im Verzeichnis / etc / docker konfiguriert wird.

Ich hatte jedoch immer noch das gleiche Problem. Was das Problem für mich schließlich löste, war die Konfiguration des Proxys über die Umgebungsvariablen http_proxy und https_proxy . Ich hatte sie in meiner Docker-Datei angegeben, aber ich habe es versäumt, dies vor dem Befehl RUN pip zu tun.

Obwohl es sich anscheinend um ein DNS-Problem handelte, machte das Verschieben dieser ENV-Befehle vor dem RUN-Befehl den Unterschied für mich. Für den Fall, dass dies für jemanden mit diesem Problem hilfreich ist.


Dies ist die einzige Lösung, die für mich funktioniert hat. Vielen Dank!!
Msingh

3

Ich kenne den Grund nicht, aber der Fehler bedeutet, dass pip versucht, den /simple/blinker/als DNS-Hostnamen anstelle des pypi.python.orgTeils aufzulösen , was sehr seltsam erscheint, da ich nicht einmal eine URL finden kann, für die urlparseeine solche Zeichenfolge als Hostname zurückgegeben werden könnte Teil. Ich würde prüfen, ob es ein Problem mit gibt~/.pip/pip.conf


3

Ich hatte das gleiche Problem. Die Fehlerursache ist Proxy.

Also bearbeite ich Dockerfile folgend

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

In meinem Fall hat es funktioniert. Die Option [user: passwd @] musste aus der Proxy-Option entfernt werden. Dies ist gemäß der Pip-Dokumentation optional: --proxy <proxy>: Geben Sie einen Proxy in der Form [user: passwd @] proxy.server: port an.
Alex Javarotti

3

Für mich wurde es durch die Verbindung mit meinem Universitäts-VPN verursacht. Trennen "gelöst" das Problem.


1

Das Konfigurieren von Docker-DNS für Google DNS (8.8.8.8) oder 10.0.0.2 funktionierte in meiner Unternehmensumgebung nicht.

Laufen: $ drill @ 8.8.8.8 www.amazon.com oder @ 10.0.0.2 haben dies bestätigt.

Um ein DNS zu finden, das funktionieren würde, habe ich Folgendes ausgeführt: $ fill www.amazon.com und es gab mir die DNS-IP, die in meinem Netzwerk verwendet wird.

Dann habe ich es in Ubuntu mit dem folgenden Schritt eingestellt, um das DNS des Dockers zu konfigurieren.

DNS in /etc/docker/daemon.json geändert

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

Restart docker: sudo service docker restart

Ich bin in der gleichen Situation, aber die Lösung scheint für mich nicht zu funktionieren. Meine Container können immer noch keine Verbindung zum externen Internet herstellen
harpratap

1

Ich bin neu bei Docker und habe alle hier genannten Methoden ausprobiert, aber immer noch nicht richtig verstanden. Die Docker-Version war 18 und die Ubuntu-Version 16. Ich habe diese Methode ausprobiert: - Zuerst habe ich Docker mit dem Internet-Netzwerk des Unternehmens erstellt. Dieses Netzwerk blockiert einige Websites oder einige, wie die Dinge hier nicht gut liefen. Also habe ich mich zweitens mit meinem eigenen Netzwerk verbunden (das ich zum Beispiel im Handy benutze) und es versucht. Dinge gingen richtig. request.txt wurde erfolgreich installiert und Docker wurde erstellt.


0

Lass es laufen. Manchmal hat Pypi Verbindungsprobleme, die lautstark in Ihr Gesicht treten, um Sie glauben zu lassen, dass es kaputt ist. Nur um sicher zu gehen, lassen Sie es rollen, Sie werden vielleicht feststellen, dass es für sich selbst funktioniert.

Das Endergebnis lautet trotz dieser roten Fehlerzeilen "Erfolgreich erstellt".

$ 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.