在构build阶段将docker-compose的环境variables传递给容器
我正在尝试使用一个Dockerfile
,几个Dockerfile
docker-compose
文件和几个envoronment_variables
文件为几个环境创buildconfiguration。 我需要它为每个环境使用python依赖关系的不同文件。
比方说,我们在两个环境中创build一个web
服务: development
和production
。 为了实现这一点,我创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
文件的正确名称。 根据文件,我尝试了这种天真的做法,似乎并不奏效:
- 将名称定义为环境variables:
- envs / dev.env:REQUIREMENTS
REQUIREMENTS=requirements_dev.txt
- envs / prod.env:REQUIREMENTS
REQUIREMENTS=requirements_prod.txt
- envs / dev.env:REQUIREMENTS
-
在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
-
在
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 ...
当我运行docker-compose up --build docker-compose-dev.yml
, $REQUIREMENTS
docker-compose up --build docker-compose-dev.yml
variables在构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演示: