Come si esegue `apt-get` in un file docker dietro un proxy?

Sto eseguendo una macchina virtuale (Ubuntu 13.10) con docker (versione 0.8.1, build a1598d1). Sto cercando di build un'image con un file dockerfile. In primo luogo, voglio aggiornare i pacchetti (usando il codice qui sotto – il proxy è obfuscato) ma apt-get ritarda con l'errore: 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 

Ho anche eseguito quanto segue nel sistema host:

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

L'host è in grado di eseguire apt-get senza alcun problema.

Come posso modificare il file dockerfile per consentirlo di raggiungere i server ubuntu dall'interno del contenitore?

Aggiornare

Ho eseguito il codice in CentOS (cambiando il FROM ubuntu:13.10 da FROM centos ) e funzionava bene. Sembra che sia un problema con Ubuntu.

UPDATE :

Hai una capitalizzazione sbagliata delle variables di ambiente in ENV. Corretto uno è http_proxy . Il tuo esempio dovrebbe essere:

 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 

Tutte le variables specificate in ENV sono precedute da each command RUN. Ogni command RUN viene eseguito nel proprio contenitore / ambiente, quindi non eredita variables dai comandi precedenti RUN!

Nota: non è necessario call il demone docker con il proxy per farlo funzionare, anche se si desidera estrarre immagini ecc. È necessario impostare il proxy anche per il deamon docker. È ansible impostare proxy per daemon in /etc/default/docker in Ubuntu (non influisce sull'impostazione dei container).


Inoltre, questo può accadere se si esegue il proxy su host (cioè localhost, 127.0.0.1). Localhost sul host differisce da localhost nel contenitore. In questo caso, è necessario utilizzare un altro IP (come 172.17.42.1) per associare il proprio proxy o se si lega a 0.0.0.0, è ansible utilizzare 172.17.42.1 anziché 127.0.0.1 per la connessione dal contenitore durante la docker build .

È inoltre ansible cercare un esempio: come ribuild rapidamente il file dockerfile utilizzando la cache?

Sotto l'impostazione in Dockerfile funziona per me. Ho provato in CoreOS , Vagrant e boot2docker . Supponiamo che la port proxy sia 3128

A Centos:

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

In Ubuntu:

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

Fare attenzione al formato, alcuni hanno http in esso, alcuni non lo hanno, alcuni con quota singola. se l'indirizzo IP è 192.168.0.193, allora l'impostazione sarà:

A Centos:

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

In Ubuntu:

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

Se è necessario impostare il proxy in coreos, ad esempio per estrarre l'image

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

È ansible utilizzare l'opzione --build-arg quando si desidera eseguire la creazione utilizzando un Dockerfile.

Da un link su https://github.com/docker/docker/issues/14634 , vedere la sezione "Crea con –build-arg con più HTTP_PROXY":

 [[email protected] 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: nel proprio sistema, assicurarsi di aver impostato le variables di ambiente HTTP_PROXY e NO_PROXY.

prima di qualsiasi command apt-get nel tuo Dockerfile , dovresti mettere questa row

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

Non dimenticare di creare apt.conf nella stessa cartella che hai Dockerfile , il contenuto del file apt.conf dovrebbe essere così:

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

se si utilizza username e password per connettersi al proxy, allora l'apt.conf dovrebbe essere come sotto:

 Acquire::socks::proxy "socks://USERNAME:[email protected]:PORT/"; Acquire::http::proxy "http://USERNAME:[email protected]:PORT/"; Acquire::https::proxy "http://USERNAME:[email protected]:PORT/"; 

per esempio :

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

Dove il foo è il nome utente e la barra è la password.

ho avuto lo stesso problema e ho trovato un'altra soluzione: ho uno script di provisioning che viene aggiunto dall'ambiente di creazione del docker. Nello script ho impostato la variabile di ambiente dipendente da un controllo 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 

questo è ancora un po 'grezzo ma ha funzionato per me

Se le proxy sono impostate correttamente e ancora non riescono a raggiungere Internet, potrebbe essere la risoluzione DNS. Controllare /etc/resolve.conf sull'host Ubuntu VM. Se contiene il nameserver 127.0.1.1 , questo è errato.

Eseguire questi comandi sull'host Ubuntu VM per risolverlo:

 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 

Ora /etc/resolv.conf deve avere un valore valido per il nameserver, che verrà copiato dai contenitori docker.

Stiamo facendo …

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

e alla fine del file dockerfile …

 ENV http_proxy "" ENV https_proxy "" 

Questo, per ora (fino a che il docker introduce la creazione env vars), consente che l'env vars proxy sia usato per la creazione SOLO senza esporli

L'alternativa alla soluzione NON è quella di build le tue immagini localmente dietro un proxy, ma di consentire a docker di build le tue immagini per voi utilizzando "build automatizzate". Dal momento che il docker non sta costruendo le immagini dietro il tuo proxy il problema è risolto. Un esempio di una build automatizzata è disponibile in …

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

https://registry.hub.docker.com/u/danday74/nginx-lua (DOCKER repo che sta guardando il repo github usando una build automatizzata e facendo una creazione di docker su una spinta al branch master del github)

e Se si desidera impostare il proxy per wget è necessario inserire queste righe nel file Dockerfile

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

Come ha sottolineato Tim Potter, l'impostazione del proxy nel file docker è orribile. Quando si crea l'image, si aggiunge il proxy per la networking aziendale, ma si può essere distribuito in cloud o in un DMZ where non esiste alcuna necessità di proxy o il server proxy è diverso.

Inoltre, non è ansible condividere la tua image con altri utenti al di fuori della tua azienda.

Utilizzare –build-arg in variabile di ambiente minuscolo:

 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 . 

Come suggerito da altre risposte, --build-arg può essere la soluzione. Nel mio caso, ho aggiunto --network=host in aggiunta alle opzioni --build-arg .

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