我正在尝试使用单个Dockerfile,几个docker- compose文件和几个envoronment_variables文件为多个环境创建配置。我需要它为每个环境使用具有python依赖关系的其他文件。
Dockerfile
docker- compose
envoronment_variables
假设我们web在两个环境中创建服务:development和production。为此,我创建了以下文件结构:
web
development
production
docker-compose-dev.yml docker-compose-prod.yml envs/ dev.env prod.env web/ Dockerfile requirements_dev.txt requirements_prod.txt
目的是在容器的过程中实例化requirements_*.txt文件的专有名称。根据文档,我尝试了这种天真的方法,这种方法似乎不起作用:Dockerfile``build
requirements_*.txt
Dockerfile``build
REQUIREMENTS=requirements_dev.txt
REQUIREMENTS=requirements_prod.txt
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
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
$REQUIREMENTS
在docker-compose 文档中有关于此的注释:
注意:如果您的服务指定了构建选项,则在构建过程中不会自动显示环境文件中定义的变量。 使用build的args子选项来定义构建时环境变量。
但是要使用中的ARG选项Dockerfile,例如ARG REQUIREMENTS,需要在中使用相应的args选项docker- compose,如下所示:
ARG
ARG REQUIREMENTS
args
services: web: build: context: ./web args: - REQUIREMENTS
但是,使用此配置,我的测试也失败了,因为根据文档,REQUIREMENTSDockerfile中变量的值取自
REQUIREMENTS
运行Compose的环境
因此,它从我的外壳中获取价值,而不是从中获取价值envs/dev.env。
envs/dev.env
所以我的问题是:
是否有可能通过环境变量 来自env_file于docker-compose 对Dockerfile在构建时没有在我的壳局部设置变量?
env_file
您的docker-compose.yml应该如下所示:
version: '2' services: web: build: context: ./web args: REQUIREMENTS: "requirements_dev.txt"
您的Dockerfile应该使用ARG如下方式定义构建参数:
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
我对此进行了验证,并在Github上创建了一个缩小的功能演示:
https://github.com/jannikweichert/stackoverflow-41747843