Passer les variables d'environnement de docker-compose à container au stade de la construction
j'essaie de créer une configuration pour plusieurs environnements avec un seul Dockerfile plusieurs docker-compose fichiers et plusieurs envoronment_variables fichiers. J'en ai besoin pour utiliser un autre fichier avec python dépendances pour chaque environnement.
disons, nous créons un web service dans deux environnements: development et production. Pour ce faire, je crée la structure de fichier suivante:
docker-compose-dev.yml
docker-compose-prod.yml
envs/
dev.env
prod.env
web/
Dockerfile
requirements_dev.txt
requirements_prod.txt
L'objectif est d'instancier le nom propre d'un requirements_*.txt le fichier dans le Dockerfile pendant le container est build processus. Selon la documentation, j'ai essayé cette approche naïve, qui ne semble pas fonctionner:
- Définir le nom d'une variable d'environnement:
- env/dev.env:
REQUIREMENTS=requirements_dev.txt - envs / prod.env:
REQUIREMENTS=requirements_prod.txt
- env/dev.env:
utilisez cette variable d'environnement dans le fichier Dockerfile:
FROM python:3.5 ENV PYTHONUNBUFFERED 1 ENV APP_ROOT /usr/src/app ... COPY $REQUIREMENTS $APP_ROOT/ RUN pip install -r $APP_ROOT/$REQUIREMENTSImporter la définition correspondante dans un
docker-composeconfiguration:version: '2' services: web: build: ./web env_file: - envs/dev.env # in docker-compose-dev.yml - envs/prod.env # in docker-compose-prod.yml ...
quand je cours docker-compose up --build docker-compose-dev.yml, le $REQUIREMENTS la variable n'est pas définie lors du processus de construction.
Dans le docker-compose documentation il y a une note à ce sujet:
Note: Si votre service spécifie une option de construction, les variables définies dans les fichiers d'environnement ne seront pas être automatiquement visible pendant la construction. Utilisez la sous-option args de build pour définir les variables d'environnement build-time.
mais pour utiliser le ARG option Dockerfile, comme ARG REQUIREMENTS on a besoin d'un correspondant args option dans docker-compose, comme ceci:
services:
web:
build:
context: ./web
args:
- REQUIREMENTS
néanmoins, avec cette configuration mes tests ont également échoué, car, selon le documentation, la valeur de l' REQUIREMENTS variable dans Dockerfile est prise à partir de
l'environnement où le Composent est en cours d'exécution
par conséquent, il prend la valeur de mon shell, mais pas de envs/dev.env.
alors ma question Est:
Est-il possible de passer la variable d'environnement
env_filedocker-composeDockerfileau moment de la construction sans paramétrer les variables localement dans mon shell?
1 réponses
votre Docker-composez.yml devrait ressembler à ceci:
version: '2'
services:
web:
build:
context: ./web
args:
REQUIREMENTS: "envs/dev.env"
votre fichier Dockerfile doit définir l'argument build-en utilisant ARG comme ceci:
FROM python:3.5
ENV PYTHONUNBUFFERED 1
ENV APP_ROOT /usr/src/app
ARG REQUIREMENTS
...
COPY $REQUIREMENTS $APP_ROOT/
RUN pip install -r $APP_ROOT/$REQUIREMENTS
j'ai validé ceci et créé une démo fonctionnelle miniifiée chez Github: