Comment exécuter 'apt-get' dans un fichier dockerfile derrière un proxy?

j'exécute une machine virtuelle (Ubuntu 13.10) avec docker (version 0.8.1, construire a1598d1). J'essaie de construire une image avec un fichier dockerfile. Tout d'abord, je veux mettre à jour les paquets (en utilisant le code ci - dessous-le proxy est masqué) mais apt-get est multiplié par l'erreur: 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

j'ai aussi exécuté ce qui suit dans le système hôte:

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

l'hôte peut exécuter apt-get sans problème.

Comment puis-je changer le dockerfile pour permettre d'atteindre la ubuntu serveurs de l'intérieur du conteneur?

mise à Jour

j'ai lancé le code dans CentOS (en changeant le FROM ubuntu:13.10 en FROM centos ) et ça a bien marché. Il semble être un problème avec Ubuntu.

57
demandé sur Christopher Louden 2014-03-04 21:50:44

12 réponses

mise à JOUR :

vous avez une mauvaise capitalisation des variables d'environnement dans ENV. La bonne est http_proxy . Votre exemple devrait être:

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

ou

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

toutes les variables spécifiées dans ENV sont prépendées à chaque commande RUN. Chaque commande RUN est exécutée dans son propre conteneur / environnement, de sorte qu'elle n'hérite pas des variables des commandes RUN précédentes!

Note: il n'est pas nécessaire d'appeler le démon docker avec un proxy pour que cela fonctionne, bien que si vous voulez tirer des images etc. vous devez définir le mandataire pour docker deamon aussi. Vous pouvez définir proxy pour daemon dans /etc/default/docker dans Ubuntu (cela n'affecte pas la configuration des conteneurs).


cela peut aussi se produire dans le cas où vous exécutez votre mandataire sur l'hôte (i.e. localhost, 127.0.0.1). Localhost sur l'hôte diffèrent de localhost en conteneur. Dans de tels cas, vous devez utiliser une autre IP (comme 172.17.42.1) pour lier votre mandataire à ou si vous liez à 0.0.0.0, vous pouvez utiliser 172.17.42.1 au lieu de 127.0.0.1 pour la connexion à partir du conteneur pendant docker build .

vous pouvez aussi chercher un exemple ici: comment reconstruire dockerfile rapidement en utilisant cache?

67
répondu Jiri 2014-03-05 07:02:06

mis à jour le 02/10/2018

avec la nouvelle fonctionnalité dans l'option docker --config , vous n'avez plus besoin de définir Proxy dans Dockerfile.

--config string      Location of client config files (default "~/.docker/config.json")

ou variable d'environnement DOCKER_CONFIG

`DOCKER_CONFIG` The location of your client configuration files.

$ export DOCKER_CONFIG=~/.docker/config.json

https://docs.docker.com/engine/reference/commandline/cli / https://docs.docker.com/network/proxy /

je recommande de définir proxy avec httpProxy, httpsProxy and ftpProxy .

{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://127.0.0.1:3001",
     "httpsProxy": "http://127.0.0.1:3001",
     "ftpProxy": "http://127.0.0.1:3001",
     "noProxy": "*.test.example.com,.example2.com"
   }
 }
}

ajuster L'adresse IP et le port de proxy si nécessaire et sauvegarder sur ~/.docker/config.json

après que vous avez mis correctement avec elle, vous pouvez exécuter docker build et docker run comme normal.

$ docker build -t demo . 

$ docker run -ti --rm demo env|grep -ri proxy
(standard input):http_proxy=http://127.0.0.1:3001
(standard input):HTTPS_PROXY=http://127.0.0.1:3001
(standard input):https_proxy=http://127.0.0.1:3001
(standard input):NO_PROXY=*.test.example.com,.example2.com
(standard input):no_proxy=*.test.example.com,.example2.com
(standard input):FTP_PROXY=http://127.0.0.1:3001
(standard input):ftp_proxy=http://127.0.0.1:3001
(standard input):HTTP_PROXY=http://127.0.0.1:3001

ancienne réponse

ci-dessous le réglage dans Dockerfile fonctionne pour moi. J'ai testé dans CoreOS , Vagrant et boot2docker . Supposons que le port de procuration est 3128

En Centos:

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

Dans Ubuntu:

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

attention au format, certains y ont du http, d'autres pas, certains avec un seul quota. si l'adresse IP est 192.168.0.193, alors le paramètre sera:

Dans Centos:

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

Dans Ubuntu:

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

si vous avez besoin de définir proxy dans coreos, par exemple pour tirer l'image

cat /etc/systemd/system/docker.service.d/http-proxy.conf

[Service]
Environment="HTTP_PROXY=http://192.168.0.193:3128"
39
répondu BMW 2018-10-04 02:35:43

vous pouvez utiliser l'option --build-arg lorsque vous voulez construire en utilisant un fichier Dockerfile.

à Partir d'un lien sur https://github.com/docker/docker/issues/14634 , voir la section "Construire avec --build-arg avec plusieurs 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 .

NOTE: Sur votre propre système, assurez-vous d'avoir défini les variables D'environnement HTTP_PROXY et NO_PROXY.

34
répondu zhanxw 2016-02-25 21:41:21

avant toute commande apt-get dans votre Dockerfile vous devez mettre cette ligne

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

N'oubliez pas de créer apt.conf dans le même dossier que vous avez le Dockerfile , le contenu du apt.conf fichier devrait être comme ceci:

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 vous utilisez nom d'utilisateur et mot de passe pour vous connecter à votre proxy, alors l'apt.conf devrait être comme ci-dessous:

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/";

par exemple:

Acquire::https::proxy "http://foo:bar@127.0.0.1:8080/";

foo est le nom d'utilisateur et barre est le mot de passe.

11
répondu Reza Farshi 2015-09-07 06:46:21

Utilisation --build-arg en minuscules variable d'environnement:

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 .
6
répondu Gaetan 2017-03-28 11:39:11

j'ai eu le même problème et trouvé une autre solution de contournement: j'ai un script de provision qui est ajouté de l'environnement de construction docker. Dans le script, j'ai défini la variable d'environnement dépendante d'une vérification 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

c'est encore un peu grossier mais a travaillé pour moi

3
répondu user3813609 2014-07-07 18:50:21

si vous avez les mandataires correctement configurés et que vous ne pouvez toujours pas accéder à internet, cela pourrait être la résolution DNS. Cochez la case /etc/resolve.conf sur l'hôte de machine virtuelle Ubuntu. S'il contient nameserver 127.0.1.1 , c'est faux.

exécutez ces commandes sur L'hôte Ubuntu VM pour le corriger:

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

maintenant /etc/resolv.conf devrait avoir une valeur valide pour le serveur de noms, qui sera copié par les conteneurs docker.

3
répondu wisbucky 2017-08-11 23:10:51

comme le suggèrent d'autres réponses, --build-arg pourrait être la solution. Dans mon cas, j'ai dû ajouter --network=host en plus des options --build-arg .

docker build -t <TARGET> --build-arg http_proxy=http://<IP:PORT> --build-arg https_proxy=http://<IP:PORT> --network=host .
2
répondu user4780495 2017-06-02 08:15:31

nous faisons ...

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

et à la fin de dockerfile ...

ENV http_proxy ""
ENV https_proxy ""

ceci, pour l'instant (jusqu'à ce que docker introduise build env vars), permet d'utiliser les env vars proxy uniquement pour la construction sans les exposer

l'alternative à la solution n'est pas de construire vos images localement derrière un proxy mais de laisser docker construire vos images pour vous en utilisant docker"automated builds". Comme docker ne construit pas le images derrière votre proxy le problème est résolu. Un exemple de construction automatisée est disponible à l'adresse suivante:...

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

https://registry.hub.docker.com/u/danday74/nginx-lua (Docker repo qui regarde le GitHub repo en utilisant une construction automatisée et en faisant une construction docker sur une poussée à la branche principale de github)

1
répondu danday74 2015-07-21 11:03:41

et si vous voulez définir proxy pour wget vous devez mettre ces lignes dans votre Dockerfile

ENV http_proxy YOUR-PROXY-IP:PORT/
ENV https_proxy YOUR-PROXY-IP:PORT/
ENV all_proxy YOUR-PROXY-IP:PORT/
1
répondu Reza Farshi 2015-09-07 06:53:11

comme L'a fait remarquer Tim Potter, la mise en place de proxy dans dockerfile est horrible. Lors de la construction de l'image, vous ajoutez un proxy pour votre réseau d'entreprise, mais vous pouvez vous déployer dans le cloud ou une DMZ où il n'y a pas besoin de proxy ou le serveur proxy est différent.

en outre, vous ne pouvez pas partager votre image avec d'autres en dehors de votre entreprise n/W.

1
répondu Dhawal 2015-12-21 18:47:35

une légère alternative à la réponse fournie par @Reza Farshi (qui fonctionne mieux dans mon cas) est d'écrire les paramètres de proxy sur /etc/apt/apt.conf en utilisant echo via le fichier Dockerfile par exemple:

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

l'avantage de cette approche est que les adresses proxy peuvent être passées dynamiquement au moment de la compilation de l'image, plutôt que d'avoir à copier le fichier de paramètres depuis l'hôte.

p.ex.

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

que par docker construire docs.

1
répondu Connor Goddard 2018-04-27 16:05:12