Aller au contenu

Travailler derrière un proxy avec Docker

En présence d'un proxy sortant pour l'accès aux ressources internet, il convient de :

Configurer le démon pour télécharger les images en utilisant le proxy

Symptôme

docker pull ou docker run ne fonctionne pas (et ce n'est pas un problème de résolution DNS).

  • Créer un fichier /etc/systemd/system/docker.service.d/http-proxy.conf en adaptant le contenu suivant :
[Service]
Environment="HTTP_PROXY=http://proxy:3128"
Environment="HTTPS_PROXY=http://proxy:3128"
Environment="NO_PROXY=localhost,127.0.0.1,::1"
  • Vérifier que ̀/etc/default/docker n'efface pas ces variables en commentant les lignes correspondantes.

  • Recharger la configuration du démon docker et le redémarrer :

sudo systemctl daemon-reload
sudo systemctl restart docker
  • Tester avec par exemple docker pull nginx

Construire les images en spécifiant le proxy avec des arguments de construction

Symptôme

La construction d'une image à partir d'un Dockerfile échoue sur les lignes RUN apt-get update, RUN curl,...

Pour la construction, il est possible de faire suivre les variables d'environnement pour la construction comme suit :

docker build --build-arg http_proxy --build-arg https_proxy ...

Avec un fichier docker-compose.yaml, nous trouverons l'équivalent suivant :

services:
  api:
    # ...
    build:
      args:
        - http_proxy
        - https_proxy
    # ...

Remarques :

  • Par rapport à l'approche consistant à utiliser ENV HTTP_PROXY=... dans les images, nous évitons ainsi de persister un proxy dans les images résultantes.
  • docs.docker.com - Configure the Docker client propose de configurer le proxy via ~/.docker/config.json mais cette approche ne fonctionnera pas avec certaines usines logicielles.

Démarrer les conteneurs en spécifiant le proxy avec des variables d'environnement

Symptôme

Mon conteneur n'arrive pas à accéder à des ressources ou services sur internet (et ce n'est pas un problème de résolution DNS).

Pour l'exécution, il est possible de définir le proxy à l'aide de variables d'environnement :

docker run -e HTTP_PROXY=$HTTP_PROXY -e HTTPS_PROXY=$HTTPS_PROXY ...

Avec un fichier docker-compose.yaml, nous trouverons l'équivalent suivant :

services:
  api:
    # ...
    environment:
      - HTTP_PROXY=${HTTP_PROXY}
      - HTTPS_PROXY=${HTTPS_PROXY}
      - http_proxy=${HTTP_PROXY}
      - https_proxy=${HTTPS_PROXY}
    # ...