当前位置:  开发笔记 > 编程语言 > 正文

在构建阶段将docker-compose中的环境变量传递给容器

如何解决《在构建阶段将docker-compose中的环境变量传递给容器》经验,为你挑选了1个好方法。

我正在尝试使用单个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文件的正确名称.根据文档,我尝试了这种天真的方法,似乎不起作用:Dockerfilebuild

    将名称定义为环境变量:

    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

然而,使用这种配置,我的测试也失败了,因为根据文档,REQUIREMENTSDockerfile 中的变量值取自

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



1> Jannik Weich..:

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

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有