Aller au contenu

Travailler derrière un proxy avec Docker

Cette fiche explique comment résoudre les problèmes rencontré avec Docker en présence d'un proxy sortant.

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}
    # ...