No se pueden instalar paquetes pip dentro de un contenedor docker con Ubuntu


86

Estoy siguiendo la guía de fig para usar Docker con una aplicación de Python, pero cuando Docker llega al comando

RUN pip install -r requirements.txt

Recibo el siguiente mensaje de error:

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/

Esto se repite varias veces y luego recibo otro mensaje:

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

Entonces, por alguna razón, pip no puede acceder a ningún paquete desde el interior de un contenedor docker. ¿Debo hacer algo para permitirle el acceso a Internet?

Sin embargo, pip funciona bien para instalar cosas fuera del contenedor de la ventana acoplable, y funcionó bien incluso con ese paquete exacto ( blinker==1.3), por lo que ese no es el problema. Además, este problema no es específico de ese paquete. Tengo el mismo problema con cualquier pip installcomando para cualquier paquete.

¿Alguien tiene alguna idea de lo que está pasando aquí?


¿Cuál es la versión de pip en su contenedor Docker? ¿Lo intentaste docker run mycontainer pip install -r requirements.pipfuera del contexto del higo? Aún así, parece que es un problema de versión pip. Para algunas versiones más nuevas de pip, necesita, así que especifique algunas opciones más de línea de comando cuando se ejecute pip installpara que encuentre ciertos paquetes.
Torsten Engelbrecht

Mi dockerfile tiene, FROM python:2.7por lo que será la versión de pip que venga con python 2.7.9. No he intentado ejecutar comandos pip por separado, pero eso se debe a que ni siquiera puedo hacer que el contenedor se compile ya que pip no funciona. Podría intentar hacer un contenedor de Python vacío y probarlo cuando tenga la oportunidad
Migwell

1
Tal vez puedas intentarlo pip install --no-use-wheel --allow-all-external -r requirements.pipo si eso no ayuda a intentarlo pip install --no-use-wheel --allow-all-external --allow-unverified blinker -r requirements.pip. Eso funcionó para mí en el pasado cuando tuve un error similar con pip install. También puede intentar eliminar esa línea del DockerFile y luego construir el contenedor sin ella para probar si el comando se puede ejecutar posteriormente. Sin embargo, como dije, no creo que ese sea el problema aquí.
Torsten Engelbrecht

Puede agregar argumentos mientras ejecuta "docker build -t <nombre de la aplicación>. --Network = host"
abhishek kumar

Respuestas:


60

Su problema proviene del hecho de que Docker no está utilizando el servidor DNS adecuado. Puede solucionarlo de tres formas diferentes:

1. Agregar DNS de Google a su configuración local

Modificando /etc/resolv.conf y agregando las siguientes líneas al final

# Google IPv4 nameservers nameserver 8.8.8.8 nameserver 8.8.4.4

Si desea agregar otros servidores DNS, eche un vistazo aquí .

Sin embargo, este cambio no será permanente (ver este hilo ). Para que sea permanente: $ sudo nano /etc/dhcp/dhclient.conf Quite el comentario y edite la línea con el prefijo domain-name-server: prepend domain-name-servers 8.8.8.8, 8.8.4.4;

Reinicio dhclient: $ sudo dhclient.

2. Modificación de la configuración de Docker

Como se explica en los documentos :

Los sistemas que ejecutan Ubuntu o un derivado de Ubuntu en el escritorio suelen utilizar 127.0.0.1 como servidor de nombres predeterminado en el archivo /etc/resolv.conf.

Para especificar un servidor DNS para que lo use 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. Usar un parámetro al ejecutar Docker

Cuando ejecute Docker, simplemente agregue el siguiente parámetro: --dns 8.8.8.8


1
He configurado dns en docker-compose, y todavía no funciona. ¿Alguna idea?
ismailsunni

14
ok, reiniciar mi docker-machine está resolviendo el problema. gracias
ismailsunni

1
Me funcionó después de agregar el DNS de Google a la configuración local pero sin especificar el servidor DNS en el archivo de configuración de Docker (no funcionó si lo hago). Estoy usando Ubuntu 14.04, con Docker 1.12.2
minhduc

Hasta donde yo sé, la --dnsbandera está disponible solo en el dockercomando. Todavía no puedo encontrar un equivalente para Docker-Compose.
Sebastialonso

26

Necesitaba agregar --network = host a mi comando de compilación de docker:

docker build --network=host -t image_name .

2
ESTE funcionó para mí sin tener que cambiar nada en mi máquina virtual Ubuntu 19.10 (que se creó con Hyper-V quick create ejecutándose en Windows 10)
Wlad

22

Tuve el mismo problema y me atormentó por un tiempo y probé muchas soluciones en línea pero fue en vano. Sin embargo, finalmente lo resolví de la siguiente manera:

Corriendo:

Ubuntu 16.04 
docker Server 18.03.0-ce
  1. Descubra la dirección de su servidor DNS.

    Descubra la dirección de su servidor DNS ejecutando el siguiente comando:

    $: nmcli dev show | grep 'IP4.DNS'
    IP4.DNS[1]:                192.168.210.2
    
  2. Actualiza el demonio de Docker

    Cree un archivo de configuración de Docker en /etc/docker/daemon.json.( si aún no tiene uno ) y agregue el siguiente contenido al archivo:

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

    El primer elemento de la matriz es el servidor DNS de su red y el segundo es el servidor DNS de Google como respaldo cuando el DNS de su red no está disponible.

    Guarde el archivo y luego reinicie el servicio Docker.

    $: sudo service docker restart
    

2
Esto resolvió mi problema con docker-ce. Nota: no tenía el archivo daemon.json. Probablemente, ese archivo no se crea de forma predeterminada durante la instalación y debe crearlo manualmente.
floatingpurr

2
Esto es lo único que me funcionó en Ubuntu 18.04.1. Pude encontrar 2 DNS del comando nmcli e incluir ambos en daemon.json.
Newalp

Es lo único que me funcionó en Ubuntu 18.04.2. La solución fue propuesta anteriormente en esta publicación por la respuesta de dekauliya
PatriceG

Funcionó. Además, esta solución es mucho menos intrusiva que el resto. ¡Gracias!
Sebastialonso

Trabajó en CentOS 7. ¡¡Gracias !!
Schoon

16

ok, reiniciar mi docker-machine está resolviendo el problema. gracias - ismailsunni

Esta fue la solución para mí:

docker-machine restart <machine-name>

1
Para aquellos de ustedes que usan Windows y no están seguros de cuál debería ser el <nombre-de-máquina> arg: abrí un PowerShell y lo ejecuté docker-machine restarty luego docker-machine env(como me lo había pedido) y solucionó el problema.
Nathan Wailes

15

Para mí, simplemente reiniciar el daemon de la ventana acoplable ayudó.

service docker restart

8

Para usuarios de Ubuntu

Debe agregar nuevas direcciones DNS en la configuración de la ventana acoplable

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

Agregue el dns después de ExecStar.

--dns 10.252.252.252 --dns 10.253.253.253

Debería verse así:

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

Entonces hazlo:

systemctl daemon-reload
sudo service docker restart

Deberia trabajar.


1
Esta es la única solución que me ha funcionado. Ubuntu 16.04, Docker 17.03.1-ce.
Simon Arsenault

2
Trabajar en Ubuntu 16.04 nada más ayudó.
Shanky

No puedo iniciar Docker después de esto: docker.service: Error con el resultado 'código de salida'.
davegallant

2
¿Hay algo particularmente especial en 10.252.252.252 y 10.253.253.253? Estoy ejecutando Ubuntu 16.04Docker 17.09.0-cey esto no funciona
Max

1
No funcionó en Ubuntu 18.04.2 LTS y Docker 18.06.1-ce
PatriceG

6

En mi caso, con docker version 1.13.0y docker-machine 0.9.0debajo Ubuntu 16.04tuve que modificar ligeramente la respuesta de Tanzaho (2. Modificar la configuración de Docker) de la siguiente manera:

  1. Inicie sesión en Ubuntu como usuario con privilegios de sudo.

  2. Abra el archivo / etc / default / docker para editarlo:

    sudo vim /etc/default/docker
    
  3. Agregue la siguiente configuración para Docker.

    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
    
  4. Guarde y cierre el archivo.

  5. Reinicie el demonio de Docker:

    sudo service docker restart
    

6

En caso de que alguien esté leyendo esto usando docker-compose. Logré resolver esto cambiando mi archivo yaml de la siguiente manera

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

que es equivalente a escribir

docker build . --network host

5

Para mí, no pude instalar pip debido a que el DNS de la ventana acoplable no estaba configurado correctamente. Probé los pasos anteriores, sin embargo, la configuración de Docker DNS para Google DNS no funciona para mi computadora portátil. El DNS de Docker se puede configurar correctamente solo si configuro su DNS en la IP asignada de mi computadora portátil.

Si usa Ubuntu, puede seguir los siguientes pasos para configurar el DNS de su Docker:

  1. Descubra la IP asignada a su dispositivo. Puede encontrar esto por

    • Comprobando la dirección inet de su ethernet o wlan en ifconfig
    • Elegir cualquier dirección en nmcli dev show | grep 'DNS'
  2. Edite dns en /etc/docker/daemon.json(cree este archivo si no existe previamente)

    {
        "dns": ["your_ip_in_step_1"]
    }
    
  3. Reinicie la ventana acoplable: sudo service docker restart


También funcionó para mí. Parece ser la solución que se aplica a las versiones más recientes de Docker. Para obtener más información, consulte askubuntu.com/a/790778/776407
Stefan Sieber

4

Como novato de Docker, tuve un problema que se manifestó de esta manera cuando estaba siguiendo el tutorial para Docker en:

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

Estoy usando Docker 17.03.1-ce en una LAN corporativa.

Verifiqué y verifiqué dos veces mi configuración de DNS. Usé varias formas de configurar el DNS que encontré en mis búsquedas en Internet. Algunos causaron errores al inicio. El enfoque que finalmente me decidí para configurar el DNS fue el de la sección Solucionar problemas de Linux del enlace anterior, donde el DNS se configura a través del archivo daemon.json en el directorio / etc / docker.

Sin embargo, todavía tenía el mismo problema. Lo que finalmente resolvió el problema para mí fue la configuración del proxy a través de las variables de entorno http_proxy y https_proxy . Los tenía especificados en mi Dockerfile, pero no lo hice antes del comando RUN pip.

Aunque parecía ser un problema de DNS, mover estos comandos ENV por delante del comando RUN marcó la diferencia para mí. En caso de que sea útil para alguien con este problema.


Esta es la única solución que funcionó para mí. ¡¡Gracias!!
msingh

3

No sé la razón, pero el error significa que pip está tratando de resolver el /simple/blinker/como un nombre de host DNS en lugar de la pypi.python.orgparte, lo que parece muy extraño ya que ni siquiera puedo encontrar una URL para la que urlparsepueda devolver una cadena como un nombre de host parte. Verificaría si hay algún problema con~/.pip/pip.conf


3

Tuve el mismo problema La causa del error es el proxy.

Entonces, edito Dockerfile siguiendo

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

Ha funcionado en mi caso. Era necesario eliminar la opción [user: passwd @] de proxy, que es opcional según la documentación de pip: --proxy <proxy>: Especifique un proxy en la forma [user: passwd @] proxy.server: port.
Alex Javarotti

3

Para mí, fue causado por estar conectado a la VPN de mi universidad. Desconectar "solucionó" el problema.


1

La configuración de Docker DNS en Google DNS (8.8.8.8) o 10.0.0.2 no funcionó en el entorno de mi empresa.

En ejecución: $ drill @ 8.8.8.8 www.amazon.com o @ 10.0.0.2 confirmaron esto.

Para encontrar un DNS que funcionara, ejecuté: $ drill www.amazon.com y me dio la IP de DNS que se está utilizando en mi red.

Luego lo configuré en Ubuntu usando el siguiente paso para configurar el DNS de Docker.

DNS modificado en /etc/docker/daemon.json

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

Restart docker: sudo service docker restart

Estoy en la misma situación, pero la solución no parece funcionar para mí. Mis contenedores todavía no son capaces de conectarse a Internet fuera
harpratap

1

Soy nuevo en Docker y probé todos los métodos mencionados aquí, pero aún no lo hice bien. la versión de Docker era 18 y la versión de ubuntu era 16. Probé este método: - Primero estaba construyendo Docker con la red de Internet de la empresa. esta red está bloqueando algunos sitios o de alguna manera las cosas no fueron bien aquí. En segundo lugar, me conecté a mi propia red (que estoy usando en un teléfono móvil, por ejemplo) y lo intenté. las cosas salieron bien. Requirement.txt se instaló correctamente y se compiló Docker.


0

Déjalo correr. A veces, Pypi tiene problemas de conexión que se ponen ruidosamente en su cara para hacerle pensar que está roto. Solo para estar seguro, déjelo rodar, es posible que descubra que funciona por sí solo.

La conclusión, a pesar de estas líneas de error rojas, es "Construido con éxito"

$ 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.