在构build阶段将docker-compose的环境variables传递给容器

我正在尝试使用一个Dockerfile ,几个Dockerfile docker-compose文件和几个envoronment_variables文件为几个环境创buildconfiguration。 我需要它为每个环境使用python依赖关系的不同文件。

比方说,我们在两个环境中创build一个web服务: developmentproduction 。 为了实现这一点,我创build了以下文件结构:

 docker-compose-dev.yml docker-compose-prod.yml envs/ dev.env prod.env web/ Dockerfile requirements_dev.txt requirements_prod.txt 

目标是在容器的build过程中在Dockerfile中实例化一个requirements_*.txt文件的正确名称。 根据文件,我尝试了这种天真的做法,似乎并不奏效:

  1. 将名称定义为环境variables:
    • envs / dev.env:REQUIREMENTS REQUIREMENTS=requirements_dev.txt
    • envs / prod.env:REQUIREMENTS REQUIREMENTS=requirements_prod.txt
  2. Dockerfile中使用这个环境variables:

     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. 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 ... 

当我运行docker-compose up --build docker-compose-dev.yml$REQUIREMENTS docker-compose up --build docker-compose-dev.ymlvariables在构build过程中没有定义。

docker-compose 文档中有一个注释:

注意:如果您的服务指定了一个构build选项,那么在构build期间,在环境文件中定义的variables将不会自动显示。 使用build的args子选项来定义构build时环境variables。

但是要在Dockerfile使用ARG选项,比如ARG REQUIREMENTS Dockerfile ,需要在Dockerfile docker-compose有相应的args选项,如下所示:

 services: web: build: context: ./web args: - REQUIREMENTS 

尽pipe如此,在这个configuration下,我的testing也失败了,因为根据文档 ,Dockerfile中的REQUIREMENTSvariables的值取自

Compose正在运行的环境

因此,它从我的shell,而不是从envs/dev.env

所以我的问题是:

是否有可能在Dockerfile时将Dockerfile docker-compose 中的Dockerfile环境variables传递Dockerfile而无需在shell中本地设置variables?

您的docker-compose.yml应该如下所示:

 version: '2' services: web: build: context: ./web args: REQUIREMENTS: "envs/dev.env" 

你的Dockerfile应该像这样使用ARG来定义构build参数:

 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 

我validation了这一点,并在Github上创build了一个精简的function演示:

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