我正在尝试使用单个Dockerfile
,多个docker-compose
文件和多个environment_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
中。根据文档,我尝试了这种不太成熟的方法,但似乎并不起作用:
- 将名称定义为环境变量:
- envs/dev.env:
REQUIREMENTS=requirements_dev.txt
- envs/prod.env:
REQUIREMENTS=requirements_prod.txt
- envs/dev.env:
在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
的文档中提到了这个问题:
但是要在注意: 如果您的服务指定了构建选项,则环境文件中定义的变量在构建期间不会自动可见。使用构建的args子选项来定义构建时环境变量。
Dockerfile
中使用ARG
选项,例如ARG REQUIREMENTS
,需要在docker-compose
中添加相应的args
选项,如下所示:services:
web:
build:
context: ./web
args:
- REQUIREMENTS
尽管如此,按照文档所述,使用这种配置我的测试也失败了,因为Dockerfile中REQUIREMENTS
变量的值是从
Compose运行的环境中
获取的,因此它会从我的shell中获取值,而不是从envs/dev.env
中获取。
因此,我的问题是:
是否有可能在构建时将
docker-compose
中的env_file
的环境变量传递给Dockerfile
,而无需在本地shell中设置变量?
env_file
和build: args: FOO: ${SOME_VAR:-foo}
,似乎SOME_VAR
没有从env_file
中加载..也许这是一个bug,即在构建参数解析之后发生环境变量文件插值,或者不应用环境变量文件插值到构建参数解析? - ColinMargs
和ARG
的目的相矛盾。因此,它是一个错误还是一个特性并不清楚。 - BartoNaz