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:

  1. Définir le nom d'une variable d'environnement:
    • env/dev.env:REQUIREMENTS=requirements_dev.txt
    • envs / prod.env:REQUIREMENTS=requirements_prod.txt
  2. 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
    
  3. 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_filedocker-composeDockerfile au moment de la construction sans paramétrer les variables localement dans mon shell?

9
demandé sur BartoNaz 2017-01-19 20:16:29

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:

https://github.com/jannikweichert/stackoverflow-41747843

23
répondu Jannik Weichert 2017-01-22 14:58:15