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/$REQUIREMENTS
Importer la définition correspondante dans un
docker-compose
configuration: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_file
docker-compose
Dockerfile
au 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: