小编典典

在构建阶段将环境变量从docker-compose传递到容器

docker

我正在尝试使用单个Dockerfile,几个docker- compose文件和几个envoronment_variables文件为多个环境创建配置。我需要它为每个环境使用具有python依赖关系的其他文件。

假设我们web在两个环境中创建服务:developmentproduction。为此,我创建了以下文件结构:

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

  1. 将名称定义为环境变量:
    • envs / dev.env: REQUIREMENTS=requirements_dev.txt
    • envs / prod.env: REQUIREMENTS=requirements_prod.txt
  2. 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
  1. 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

但是,使用此配置,我的测试也失败了,因为根据文档REQUIREMENTSDockerfile中变量的值取自

运行Compose的环境

因此,它从我的外壳中获取价值,而不是从中获取价值envs/dev.env

所以我的问题是:

是否有可能通过环境变量 来自env_filedocker-compose
Dockerfile在构建时没有在我的壳局部设置变量?


阅读 318

收藏
2020-06-17

共1个答案

小编典典

您的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

2020-06-17