web-dev-qa-db-fra.com

Comment rendre les variables d'environnement disponibles pour les commandes Docker RUN à partir de docker-compose?

J'ai une application Dockerised que je voudrais exécuter dans les environnements hôtes proxy et non proxy. J'essaie de résoudre ce problème en copiant les variables d'environnement normales, telles que http_proxy, dans les conteneurs si et seulement s'ils existent dans l'hôte. 

Je peux obtenir 90% du trajet en courant 

set | grep -i _proxy=>proxies.env

dans un script de niveau supérieur, puis après avoir, dans mon fichier docker-compose.yml:

myserver:
  build: ./myserver
  env_file:
   - proxies.env

Cela copie les variables de proxy d'environnement de l'hôte, le cas échéant, dans le conteneur du serveur, et cela fonctionne dans le sens où ces variables sont disponibles au moment de l'exécution du conteneur, c'est-à-dire à l'étape d'exécution par le CMD de Dockerfile ou ENTRYPOINT.

Cependant, j'ai un conteneur qui doit exécuter npm en tant qu'étape de construction, c'est-à-dire à partir d'une commande RUN dans le fichier Dockerfile, et ces variables ne semblent pas être présentes à ce stade. Npm ne peut donc pas trouver le proxy et se bloque. Dans d'autres travaux, si j'ai

RUN set

dans mon fichier Docker, je ne vois aucune variable de proxies.env, mais si je le fais

docker exec -it myserver /bin/bash

et puis couru ensemble, je peux tout voir de proxies.env.

Quelqu'un peut-il recommander un moyen de rendre ces variables visibles au moment de la génération du conteneur, sans avoir à les coder en dur, de sorte que mon fichier docker-compose.yml et mon fichier Docker fonctionnent toujours pour les hôtes avec proxys et les hôtes sans proxies?

(Fonctionne avec centos 7, docker-compose 1.3.1 et docker 1.7.0)

12
Francis Norton

Peut-être que vous pouvez essayer ceci:

Avant d'appeler RUN, ADD le fichier .env dans l'image

ADD proxies.env proxies.env

puis préfixez votre instruction RUN:

RUN export `cat proxies.env` && echo "FOO is $FOO and BAR is $BAR"

Cela produit la sortie suivante:

root@armenubuntudev:~/Dockers/set-env# docker build -t ashimoon/envtest .
Sending build context to Docker daemon 3.584 kB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu
 ---> 91e54dfb1179
Step 1 : ADD proxies.env proxies.env
 ---> Using cache
 ---> 181d0e082e65
Step 2 : RUN export `cat proxies.env` && echo "FOO is $FOO and BAR is $BAR"
 ---> Running in 30426910a450
FOO is 1 and BAR is 2
 ---> 5d88fcac522c
Removing intermediate container 30426910a450
Successfully built 5d88fcac522c
3
armen.shimoon

Mise à jour 2016, docker-compose 1.6.2, docker 1.10+, avec un docker-compose.yml version 2 :

Vous avez maintenant la sous-section args: de la section build: , qui inclut cette possibilité très intéressante:

Les arguments de construction comportant uniquement une clé sont résolus en leur valeur d'environnement sur la machine sur laquelle Compose est exécuté sur.

Voir PR 2653 (janvier 2016)

Par conséquent, un moyen d'introduire les variables proxy sans les coder en dur dans le fichier docker-compose.yml lui-même est avec cette syntaxe précise:

version: '2'
services:
  myservice:
    build:
      context: .
      args:
        - http_proxy
        - https_proxy
        - no_proxy

Avant d'appeler docker-compos up, vous devez vous assurer que vos variables d'environnement proxy sont définies:

export http_proxy=http://username:[email protected]:port
export https_proxy=http://username:[email protected]:port
export no_proxy=localhost,127.0.0.1,company.com

docker-compose up

Ensuite, votre Dockerfile construite par le processus docker-compose récupérera automatiquement les valeurs de variable proxy, même si le docker-compose.yml n'inclut aucune valeur spécifique codée en dur.

30
VonC

Peut-être que l'option "environnement" résout votre problème. Dans votre docker, le fichier de composition ressemblerait à:

myserver:
   build: ./myserver
   environment:
   - HTTP_PROXY=192.168.1.8
   - VARIABLE=value
   - ...
5
Radhwane Chebaane

docker-compose.yml

...
server:
  build: .
  args:
    env: $ENV
...

Dockerfile

ARG env

ENV NODE_ENV $env
2

Cet exemple corrige YUM.

version: '2'
services:  
  example-service:
    build:
      context: .
      args:
        http_proxy: proxy.example.com:80
0
Moriarty