web-dev-qa-db-fra.com

Impossible d'installer des paquets pip dans un conteneur de menu fixe avec Ubuntu

Je suis le fig guide à utiliser docker avec une application python, mais quand docker se lève à la commande

RUN pip install -r requirements.txt

Je reçois le message d'erreur suivant:

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/

Cela se répète plusieurs fois et je reçois un autre message:

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

Donc, pour une raison quelconque, pip ne peut accéder à aucun paquet depuis un conteneur de menu fixe. Dois-je faire quelque chose pour lui permettre d'accéder à Internet?

Cependant, pip fonctionne très bien pour installer des éléments en dehors du conteneur de menu fixe, et a bien fonctionné même avec ce package exact (blinker==1.3). De plus, ce problème n'est pas spécifique à ce paquet. J'ai le même problème avec n'importe quelle commande pip install pour n'importe quel paquet.

Est-ce que quelqu'un a une idée de ce qui se passe ici?

44
Miguel

Votre problème vient du fait que Docker n’utilise pas le serveur DNS approprié . Vous pouvez le réparer de trois manières différentes:

1. Ajouter Google DNS à votre configuration locale

Modification de /etc/resolv.conf et ajout des lignes suivantes à la fin

# Google IPv4 nameservers nameserver 8.8.8.8 nameserver 8.8.4.4

Si vous souhaitez ajouter d'autres serveurs DNS, regardez ici .

Cependant, ce changement ne sera pas permanent (voir ce fil de discussion ). Pour le rendre permanent: $ Sudo nano /etc/dhcp/dhclient.conf Décommentez et éditez la ligne avec le préfixe domain-name-server: prepend domain-name-servers 8.8.8.8, 8.8.4.4;

Redémarrez dhclient: $ Sudo dhclient.

2. Modification de la configuration de Docker

Comme expliqué dans la documentation :

Les systèmes qui exécutent Ubuntu ou un dérivé d'Ubuntu sur le bureau utilisent généralement 127.0.0.1 comme serveur de noms par défaut dans le fichier /etc/resolv.conf.

Pour spécifier un serveur DNS à utiliser par 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. Utilisation d'un paramètre lorsque vous exécutez Docker

Lorsque vous exécutez docker, ajoutez simplement le paramètre suivant: --dns 8.8.8.8 

47
Tanzaho

ok, redémarrer mon docker-machine résout le problème. merci - ismailsunni

C'était la solution pour moi:

docker-machine restart <machine-name>
15
orluke

J'ai eu le même problème et cela m'a tourmenté pendant un moment et j'ai essayé beaucoup de solutions en ligne, mais en vain. Cependant, je l'ai finalement résolu comme suit:

Fonctionnement:

Ubuntu 16.04 
docker Server 18.03.0-ce
  1. Découvrez l'adresse de votre serveur DNS.

    Découvrez l'adresse de votre serveur DNS en exécutant la commande suivante:

    $: nmcli dev show | grep 'IP4.DNS'
    IP4.DNS[1]:                192.168.210.2
    
  2. Mettre à jour le démon Docker

    Créez un fichier de configuration de menu fixe à /etc/docker/daemon.json. ( si vous n'en avez pas déjà un ) et ajoutez le contenu suivant au fichier:

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

    Le premier élément de la matrice est le serveur DNS de votre réseau et le second est le serveur DNS de Google en remplacement lorsque le DNS de votre réseau n'est pas disponible.

    Enregistrez le fichier, puis redémarrez le service de menu fixe

    $: Sudo service docker restart
    
11
user3214005

Pour moi, redémarrer simplement le démon docker m'a aidé.

service docker restart
9
Bartoszer

Pour les utilisateurs Ubuntu

Vous devez ajouter de nouvelles adresses DNS dans la configuration de menu fixe.

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

Ajoutez les DNS après ExecStar.

--dns 10.252.252.252 --dns 10.253.253.253

Devrait ressembler à ça: 

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

Alors fais:

systemctl daemon-reload
Sudo service docker restart

Devrait marcher.

6
Broski

Pour moi, je n'ai pas pu installer pip car le DNS du docker n'est pas configuré correctement. Cependant, j'ai essayé les étapes ci-dessus, la configuration du DNS de docker sur Google DNS ne fonctionnant pas pour mon ordinateur portable. Le DNS de Docker ne peut être correctement configuré que si je règle son DNS sur l'adresse IP attribuée à mon ordinateur portable. 

Si vous utilisez Ubuntu, vous pouvez utiliser les étapes suivantes pour configurer le DNS de votre docker:

  1. Découvrez l'adresse IP attribuée à votre appareil. Vous pouvez le trouver soit

    • Vérification de l'adresse réseau de votre ethernet ou wlan dans ifconfig
    • Choisir une adresse dans nmcli dev show | grep 'DNS'
  2. Éditez le DNS dans /etc/docker/daemon.json (créez ce fichier s'il n'existait pas auparavant)

    {
        "dns": ["your_ip_in_step_1"]
    }
    
  3. Redémarrer le menu fixe: Sudo service docker restart

4
dekauliya

En tant que débutant chez Docker, j'ai eu un problème qui s'est manifesté de cette façon lorsque je suivais le tutoriel pour Docker à l'adresse suivante:

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

J'utilise Docker 17.03.1-ce sur un réseau local d'entreprise.

J'ai vérifié et vérifié deux fois mes paramètres DNS. J'avais utilisé divers moyens de configurer le DNS que j'avais trouvé lors de mes recherches sur Internet. Certains ont causé des erreurs au démarrage. L'approche sur laquelle j'ai finalement choisi de configurer le DNS était celle de la section Dépanner Linux du lien ci-dessus, où le DNS est configuré via le fichier daemon.json du répertoire/etc/docker.

Cependant, j'avais toujours le même problème. Ce qui a finalement résolu le problème pour moi, c’est la configuration du proxy via les variables d’environnement http_proxy et https_proxy. Je les avais spécifiés dans mon Dockerfile, mais j'avais négligé de le faire avant la commande RUN pip.

Même si cela semblait être un problème de DNS, le fait de déplacer ces commandes ENV avant la commande RUN a fait la différence pour moi. Dans le cas où cela serait utile à quiconque ayant ce problème.

3
Deon McClung

Dans mon cas, avec docker version 1.13.0 et docker-machine 0.9.0 sous Ubuntu 16.04, j'ai dû modifier légèrement la réponse de Tanzaho (2. Modifier la configuration de Docker) comme suit:

  1. Connectez-vous à Ubuntu en tant qu'utilisateur disposant des privilèges Sudo.

  2. Ouvrez le fichier/etc/default/docker pour le modifier:

    Sudo vim /etc/default/docker
    
  3. Ajoutez le paramètre suivant pour Docker.

    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
    
  4. Enregistrez et fermez le fichier.

  5. Redémarrez le démon Docker:

    Sudo service docker restart
    
3
vabada

Je ne connais pas la raison, mais l'erreur signifie que pip tente de résoudre le /simple/blinker/ en tant que nom d'hôte DNS au lieu de la partie pypi.python.org, ce qui semble très étrange puisque je ne peux même pas trouver d'URL pour laquelle urlparse pourrait renvoyer une telle chaîne en tant que partie du nom d'hôte. Je vérifierais s'il y a un problème avec ~/.pip/pip.conf

2
Antti Haapala

Laissez-le courir. Parfois, pypi a des problèmes de connexion qui vous sont adressés pour vous faire croire qu'il est en panne. Juste pour être sûr, laissez-le rouler, vous pourriez trouver que ça marche tout seul.

La ligne du bas, malgré ces lignes d’erreur rouges, est "construit avec succès"

$ 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
1
John Mee

J'ai eu le même problème. La cause de l'erreur est un proxy.

Donc, je modifie Dockerfile après

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

La configuration du DNS du menu fixe sur Google DNS (8.8.8.8) ou 10.0.0.2 ne fonctionnait pas dans l'environnement de mon entreprise. 

En cours d’exécution: $ drill @ 8.8.8.8 www.Amazon.com ou @ 10.0.0.2 l’a confirmé. 

Afin de trouver un DNS qui fonctionnerait, j'ai lancé: $ Drill www.Amazon.com et il m'a donné l'adresse IP du DNS utilisée sur mon réseau. 

Ensuite, je l'ai configuré dans Ubuntu en utilisant l'étape suivante pour configurer le DNS de docker.

Dns modifiés dans /etc/docker/daemon.json

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

Restart docker: Sudo service docker restart
1
Tomas

Dans le cas où quelqu'un lit ceci en utilisant docker-compose. J'ai réussi à résoudre ce problème en modifiant mon fichier yaml comme suit

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

ce qui équivaut à écrire

docker build . --network Host
0
Luke Preston

J'avais besoin d'ajouter --network = Host à ma commande de construction de docker:

docker build --network=Host -t image_name .
0
Dan Hook

Je suis nouveau chez Docker et j'ai essayé toutes les méthodes mentionnées ici, mais je ne l'ai toujours pas bien compris. la version Docker était 18, et la version ubuntu était 16. J'ai essayé cette méthode: - Tout d'abord, je construisais docker avec le réseau Internet de l'entreprise. ce réseau bloque certains sites ou certaines choses qui ne se sont pas bien passées ici. Donc, deuxièmement, je me suis connecté à mon propre réseau (qui utilise par exemple un téléphone portable) et j'ai essayé. les choses se sont bien passées. require.txt a été installé avec succès et le menu fixe a été construit.

0
Piyal George

Pour moi, cela a été causé par la connexion au VPN de mon université. Déconnecter "résolu" le problème.

0
p0wl