tag run library imagenes hub example dockers container docker apt http-proxy

run - ¿Cómo se ejecuta `apt-get` en un archivo docker detrás de un proxy?



dockers container download (12)

Como señaló Tim Potter, establecer proxy en dockerfile es horrible. Al compilar la imagen, agregas un proxy para tu red corporativa, pero puedes estar desplegándote en la nube o en una DMZ donde no hay necesidad de un proxy o el servidor proxy es diferente.

Además, no puede compartir su imagen con otras personas ajenas a su empresa n / w.

Estoy ejecutando una máquina virtual (Ubuntu 13.10) con docker (versión 0.8.1, compilación a1598d1). Estoy tratando de construir una imagen con un archivo docker. Primero, quiero actualizar los paquetes (utilizando el siguiente código - el proxy está ofuscado) pero apt-get termina con el error: Could not resolve ''archive.ubuntu.com'' .

FROM ubuntu:13.10 ENV HTTP_PROXY <HTTP_PROXY> ENV HTTPS_PROXY <HTTPS_PROXY> RUN export http_proxy=$HTTP_PROXY RUN export https_proxy=$HTTPS_PROXY RUN apt-get update && apt-get upgrade

También ejecuté lo siguiente en el sistema host:

sudo HTTP_PROXY=http://<PROXY_DETAILS>/ docker -d &

El host puede ejecutar apt-get sin problema.

¿Cómo puedo cambiar el archivo docker para permitir que llegue a los servidores de ubuntu desde el contenedor?

Actualizar

Ejecuté el código en CentOS (cambiando el FROM ubuntu:13.10 a FROM centos ) y funcionó bien. Parece ser un problema con Ubuntu.


Como sugieren otras respuestas, --build-arg puede ser la solución. En mi caso, tuve que agregar --network=host además de las opciones --build-arg .

docker build -t <TARGET> --build-arg http_proxy=http://<IP:PORT> --build-arg https_proxy=http://<IP:PORT> --network=host .


La siguiente configuración en Dockerfile funciona para mí. boot2docker en CoreOS , Vagrant y boot2docker . Supongamos que el puerto proxy es 3128

En Centos:

ENV http_proxy=ip:3128 ENV https_proxy=ip:3128

En Ubuntu:

ENV http_proxy ''http://ip:3128'' ENV https_proxy ''http://ip:3128''

Tenga cuidado con el formato, algunos tienen http, otros no, algunos con cuota única. si la dirección IP es 192.168.0.193, la configuración será:

En Centos:

ENV http_proxy=192.168.0.193:3128 ENV https_proxy=192.168.0.193:3128

En Ubuntu:

ENV http_proxy ''http://192.168.0.193:3128'' ENV https_proxy ''http://192.168.0.193:3128''

Si necesita establecer el proxy en coreos, por ejemplo, para extraer la imagen

cat /etc/systemd/system/docker.service.d/http-proxy.conf [Service] Environment="HTTP_PROXY=http://192.168.0.193:3128"


Nosotros estamos haciendo ...

ENV http_proxy http://9.9.9.9:9999 ENV https_proxy http://9.9.9.9:9999

y al final de dockerfile ...

ENV http_proxy "" ENV https_proxy ""

Esto, por ahora (hasta que Docker introduce los archivos de compilación), permite que los servidores proxy se usen solo para la compilación sin exponerlos

La alternativa a la solución NO es construir tus imágenes localmente detrás de un proxy, sino dejar que Docker construya tus imágenes para ti usando Docker "builds automatizadas". Como Docker no está creando las imágenes detrás de su proxy, el problema está resuelto. Un ejemplo de construcción automática está disponible en ...

https://github.com/danday74/docker-nginx-lua (repo de GITHUB)

https://registry.hub.docker.com/u/danday74/nginx-lua (Repo de DOCKER que está viendo el repositorio github usando una compilación automatizada y haciendo una compilación de docker en un push a la rama principal de github)


Puedes usar la opción --build-arg cuando quieras construir usando un Dockerfile.

Desde un enlace en https://github.com/docker/docker/issues/14634 , consulte la sección "Build with --build-arg with multiple HTTP_PROXY":

[root@pppdc9prda2y java]# docker build --build-arg https_proxy=$HTTP_PROXY --build-arg http_proxy=$HTTP_PROXY --build-arg HTTP_PROXY=$HTTP_PROXY --build-arg HTTPS_PROXY=$HTTP_PROXY --build-arg NO_PROXY=$NO_PROXY --build-arg no_proxy=$NO_PROXY -t java .

NOTA: en su propio sistema, asegúrese de haber configurado las variables de entorno HTTP_PROXY y NO_PROXY.


Si tiene los proxies configurados correctamente y aún no puede acceder a Internet, podría ser la resolución de DNS. Compruebe /etc/resolve.conf en el host Ubuntu VM. Si contiene el nameserver 127.0.1.1 , eso es incorrecto.

Ejecute estos comandos en la máquina virtual Ubuntu de host para solucionarlo:

sudo vi /etc/NetworkManager/NetworkManager.conf # Comment out the line `dns=dnsmasq` with a `#` # restart the network manager service sudo systemctl restart network-manager cat /etc/resolv.conf

Ahora /etc/resolv.conf debería tener un valor válido para nameserver, que será copiado por los contenedores Docker.


Tuve el mismo problema y encontré otra pequeña solución: tengo un script de aprovisionamiento que se agrega desde el entorno de compilación de Docker. En el script, configuro la variable de entorno en función de una comprobación de ping:

Dockerfile:

ADD script.sh /tmp/script.sh RUN /tmp/script.sh

script.sh:

if ping -c 1 ix.de ; then echo "direct internet doing nothing" else echo "proxy environment detected setting proxy" export http_proxy=<proxy address> fi

esto todavía es un tanto crudo pero funcionó para mí


Una ligera alternativa a la respuesta proporcionada por @Reza Farshi (que funciona mejor en mi caso) es escribir la configuración del proxy en /etc/apt/apt.conf usando echo través del archivo Docker, por ejemplo:

FROM ubuntu:16.04 RUN echo "Acquire::http::proxy /"$HTTP_PROXY/";/nAcquire::https::proxy /"$HTTPS_PROXY/";" > /etc/apt/apt.conf # Test that we can now retrieve packages via ''apt-get'' RUN apt-get update

La ventaja de este enfoque es que las direcciones proxy se pueden pasar dinámicamente en el momento de creación de la imagen, en lugar de tener que copiar el archivo de configuración desde el host.

p.ej

docker build --build-arg HTTP_PROXY=http://<host>:<port> --build-arg HTTPS_PROXY=http://<host>:<port> .

según docker construir documentos.


Use --build-arg en la variable de entorno minúscula:

docker build --build-arg http_proxy=http://proxy:port/ --build-arg https_proxy=http://proxy:port/ --build-arg ftp_proxy=http://proxy:port --build-arg no_proxy=localhost,127.0.0.1,company.com -q=false .


antes de cualquier comando apt-get en tu archivo Docker debes poner esta línea

COPY apt.conf /etc/apt/apt.conf

No se olvide de crear apt.conf en la misma carpeta que tiene Dockerfile , el contenido del archivo apt.conf debería ser así:

Acquire::socks::proxy "socks://YOUR-PROXY-IP:PORT/"; Acquire::http::proxy "http://YOUR-PROXY-IP:PORT/"; Acquire::https::proxy "http://YOUR-PROXY-IP:PORT/";

si usa el nombre de usuario y la contraseña para conectarse a su proxy, el apt.conf debería ser como el siguiente:

Acquire::socks::proxy "socks://USERNAME:PASSWORD@YOUR-PROXY-IP:PORT/"; Acquire::http::proxy "http://USERNAME:PASSWORD@YOUR-PROXY-IP:PORT/"; Acquire::https::proxy "http://USERNAME:PASSWORD@YOUR-PROXY-IP:PORT/";

por ejemplo :

Acquire::https::proxy "http://foo:[email protected]:8080/";

Donde el foo es el nombre de usuario y la barra es la contraseña.


y si quieres establecer un proxy para wget deberías poner estas líneas en tu archivo Docker

ENV http_proxy YOUR-PROXY-IP:PORT/ ENV https_proxy YOUR-PROXY-IP:PORT/ ENV all_proxy YOUR-PROXY-IP:PORT/


ACTUALIZAR :

Tiene una capitalización incorrecta de las variables de entorno en ENV. El correcto es http_proxy . Tu ejemplo debería ser:

FROM ubuntu:13.10 ENV http_proxy <HTTP_PROXY> ENV https_proxy <HTTPS_PROXY> RUN apt-get update && apt-get upgrade

o

FROM centos ENV http_proxy <HTTP_PROXY> ENV https_proxy <HTTPS_PROXY> RUN yum update

Todas las variables especificadas en ENV se anteponen a cada comando RUN. ¡Cada comando RUN se ejecuta en contenedor / entorno propio, por lo que no hereda variables de los comandos RUN anteriores!

Nota: No hay necesidad de llamar a Docker Daemon con proxy para que esto funcione, aunque si desea extraer imágenes, etc., también debe configurar el proxy para Docker Deamon. Puede configurar el proxy para daemon en /etc/default/docker en Ubuntu (no afecta la configuración de los contenedores).

Además, esto puede suceder en caso de que ejecute su proxy en el host (es decir, localhost, 127.0.0.1). Localhost en host difiere de localhost en contenedor. En tal caso, necesita usar otra IP (como 172.17.42.1) para vincular su proxy o si se vincula a 0.0.0.0, puede usar 172.17.42.1 en lugar de 127.0.0.1 para la conexión desde el contenedor durante la docker build .

También puede buscar un ejemplo aquí: ¿Cómo reconstruir rápidamente dockerfile usando caché?