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)
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
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.
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
- ...
docker-compose.yml
...
server:
build: .
args:
env: $ENV
...
Dockerfile
ARG env
ENV NODE_ENV $env
Cet exemple corrige YUM.
version: '2'
services:
example-service:
build:
context: .
args:
http_proxy: proxy.example.com:80