我正在尝试使用单个Dockerfile
,多个docker-compose
文件和多个envoronment_variables
文件为多个环境创建配置.我需要它为每个环境使用具有python依赖关系的不同文件.
比方说,我们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
将名称定义为环境变量:
ENVS/dev.env: REQUIREMENTS=requirements_dev.txt
ENVS/prod.env: REQUIREMENTS=requirements_prod.txt
在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
在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
文档中有一个关于此的说明:
注意:如果您的服务指定了构建选项,则在构建期间,环境文件中定义的变量将不会自动显示.使用build的args子选项来定义构建时环境变量.
但要使用中的ARG
选项Dockerfile
,就像ARG REQUIREMENTS
需要相应的args
选项docker-compose
一样,如下所示:
services: web: build: context: ./web args: - REQUIREMENTS
然而,使用这种配置,我的测试也失败了,因为根据文档,REQUIREMENTS
Dockerfile 中的变量值取自
Compose正在运行的环境
因此,它从我的shell获取价值,但不是从envs/dev.env
.
所以我的问题是:
是否可以将环境变量从
env_file
in 传递docker-compose
到Dockerfile
构建时,而无需在shell中本地设置变量?
Jannik Weich.. 30
你的docker-compose.yml应如下所示:
version: '2' services: web: build: context: ./web args: REQUIREMENTS: "requirements_dev.txt"
你的Dockerfile应该使用ARG
如下定义build-argument :
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
你的docker-compose.yml应如下所示:
version: '2' services: web: build: context: ./web args: REQUIREMENTS: "requirements_dev.txt"
你的Dockerfile应该使用ARG
如下定义build-argument :
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