Bar*_*Naz 14 docker docker-compose
我正在尝试使用单个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
Run Code Online (Sandbox Code Playgroud)
目标是在容器的进程中实例化requirements_*.txt文件的正确名称.根据文档,我尝试了这种天真的方法,似乎不起作用:Dockerfilebuild
REQUIREMENTS=requirements_dev.txtREQUIREMENTS=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
Run Code Online (Sandbox Code Playgroud)在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
...
Run Code Online (Sandbox Code Playgroud)当我运行时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
Run Code Online (Sandbox Code Playgroud)
然而,使用这种配置,我的测试也失败了,因为根据文档,REQUIREMENTSDockerfile 中的变量值取自
Compose正在运行的环境
因此,它从我的shell获取价值,但不是从envs/dev.env.
所以我的问题是:
是否可以将环境变量从
env_filein 传递docker-compose到Dockerfile构建时,而无需在shell中本地设置变量?
Jan*_*ert 30
你的docker-compose.yml应如下所示:
version: '2'
services:
web:
build:
context: ./web
args:
REQUIREMENTS: "requirements_dev.txt"
Run Code Online (Sandbox Code Playgroud)
你的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
Run Code Online (Sandbox Code Playgroud)
我验证了这一点并在Github上创建了一个缩小的功能演示:
https://github.com/jannikweichert/stackoverflow-41747843
| 归档时间: |
|
| 查看次数: |
6713 次 |
| 最近记录: |