web-dev-qa-db-fra.com

Comment lancez-vous `apt-get` dans un fichier docker derrière un proxy?

J'exécute une machine virtuelle (Ubuntu 13.10) avec docker (version 0.8.1, build a1598d1). J'essaie de construire une image avec un fichier docker. Tout d’abord, je veux mettre à jour les paquets (en utilisant le code ci-dessous - le proxy est obscurci) mais apt-get expire avec 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 également exécuté ce qui suit dans le système hôte:

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

L'hôte est capable d'exécuter apt-get sans problème.

Comment puis-je changer le fichier docker pour lui permettre d’atteindre les serveurs Ubuntu à partir du conteneur?

Mise à jour

J'ai couru le code dans CentOS (changer le FROM ubuntu:13.10 à FROM centos) et cela a bien fonctionné. Cela semble être un problème avec Ubuntu.

63

[~ # ~] met à jour [~ # ~] :

La capitalisation des variables d'environnement dans ENV est incorrecte. Le bon 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 ajoutées à chaque commande RUN. Chaque commande RUN est exécutée dans son propre conteneur/environnement, elle n'hérite donc pas des variables des commandes RUN précédentes!

Remarque: Il n'est pas nécessaire d'appeler le démon docker avec proxy pour que cela fonctionne. Toutefois, si vous souhaitez extraire des images, etc., vous devez également définir le proxy pour Deamon Deamon. Vous pouvez définir le proxy pour le démon dans /etc/default/docker dans Ubuntu (cela n’affecte pas le réglage des conteneurs).


Cela peut également arriver si vous exécutez votre proxy sur l'hôte (c'est-à-dire localhost, 127.0.0.1). L'hôte local sur l'hôte diffère de l'hôte local dans le conteneur. Dans ce cas, vous devez utiliser une autre adresse IP (telle que 172.17.42.1) pour lier votre proxy à. Si vous vous liez à 0.0.0.0, vous pouvez utiliser 172.17.42.1 au lieu de 127.0.0.1 pour la connexion à partir d'un conteneur pendant docker build.

Vous pouvez également chercher un exemple ici: Comment reconstruire rapidement un fichier docker en utilisant le cache?

83
Jiri

Mise à jour le 02/10/2018

Avec une nouvelle fonctionnalité dans l'option de menu fixe --config, vous n'avez plus besoin de configurer Proxy dans Dockerfile. Vous pouvez avoir le même fichier Dockerfile à utiliser dans l'environnement d'entreprise.

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

ou variable d'environnement DOCKER_CONFIG

`DOCKER_CONFIG` The location of your client configuration files.

$ export DOCKER_CONFIG=~/.docker

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

https://docs.docker.com/network/proxy/

Je recommande de configurer le proxy avec httpProxy, httpsProxy, ftpProxy et noProxy (le document officiel manque la variable ftpProxy qui est parfois utile)

{
 "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"
   }
 }
}

Ajustez l’adresse IP et le port du proxy si nécessaire et enregistrez-le sur ~/.docker/config.json

Une fois que vous avez défini correctement avec elle, vous pouvez exécuter docker build et docker fonctionner normalement.

$ 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 (déclassée)

Le réglage ci-dessous dans Dockerfile fonctionne pour moi. J'ai testé dans CoreOS, Vagrant et boot2docker. Supposons que le port proxy 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'

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

En 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 un proxy dans coreos, par exemple pour extraire l'image

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

[Service]
Environment="HTTP_PROXY=http://192.168.0.193:3128"
47
BMW

Vous pouvez utiliser le --build-arg _ lorsque vous souhaitez créer à l'aide d'un fichier Dockerfile.

Depuis 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 .

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

37
zhanxw

avant toute commande apt-get dans votre fichier Docker , 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 fichier Docker , le contenu du fichier apt.conf devrait ressembler à 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 un nom d'utilisateur et un mot de passe pour vous connecter à votre proxy, le fichier apt.conf devrait ressembler à ceci:

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:[email protected]:8080/";

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

11
Reza Farshi

Utilisez --build-arg dans la variable d'environnement minuscule:

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 .
7
Gaetan

j'ai eu le même problème et j'ai trouvé une autre petite solution de contournement: j'ai un script d'approvisionnement qui est ajouté à partir de l'environnement de construction de docker. Dans le script, je définis la variable d'environnement en fonction 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 brut mais a travaillé pour moi

3
user3813609

Si les proxys sont correctement configurés et que vous ne pouvez toujours pas accéder à Internet, il pourrait s'agir de la résolution DNS. Vérifier /etc/resolve.conf sur la machine virtuelle hôte Ubuntu. S'il contient nameserver 127.0.1.1, C'est faux.

Exécutez ces commandes sur l'hôte Ubuntu VM pour résoudre ce problème:

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ée par les conteneurs du menu fixe.

3
wisbucky

Comme suggéré par d'autres réponses, --build-arg peut être la solution. Dans mon cas, je devais ajouter --network=Host en plus de --build-arg Les options.

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

Comme Tim Potter l'a fait remarquer, définir un proxy dans dockerfile est horrible. Lors de la création de l'image, vous ajoutez un proxy pour votre réseau d'entreprise, mais vous pouvez déployer dans le cloud ou DMZ) sans avoir besoin de proxy ou si le serveur proxy est différent.

En outre, vous ne pouvez pas partager votre image avec d'autres personnes extérieures à votre entreprise n/w.

1
Dhawal

et Si vous voulez définir un 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
Reza Farshi

Une légère alternative à la réponse fournie par @Reza Farshi (qui fonctionne mieux dans mon cas) consiste à é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 transmises de manière dynamique au moment de la création de l'image, au lieu de copier le fichier de paramètres à partir de l'hôte.

par exemple.

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

selon construction de docker docs.

1
Connor Goddard

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 le moment (jusqu’à ce que docker présente les variables d’environnement de construction), permet d’utiliser les variables d’env de proxy pour la construction UNIQUEMENT sans les exposer.

L’alternative à la solution n’est PAS de créer vos images localement derrière un proxy, mais de laisser docker construire vos images pour vous à l’aide de "versions automatisées" de docker. Puisque docker ne construit pas les images derrière votre proxy, le problème est résolu. Un exemple de construction automatisée est disponible à l'adresse ...

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

https://registry.hub.docker.com/u/danday74/nginx-lua (Repo DOCKER qui surveille le repo de github en utilisant une construction automatisée et effectue une construction de docker sur un Push to the github branche principale)

1
danday74