【问题标题】:Child environment variable does not get setup properly, why?子环境变量没有正确设置,为什么?
【发布时间】:2021-01-07 23:59:14
【问题描述】:

我有一个“主”Docker 项目,它通过主 docker-compose.yml.env 文件触发一些子项目。请参阅以下目录结构,以便您更好地了解:

`-- project/
    `-- docker-compose.yml/
        |-- .env
        |-- project-1/
        |   |-- docker-compose.yml
        |   `-- .env
        `-- project-2/
            |-- docker-compose.yml
            `-- .env

.env 主文件 (/project/.env) 如下所示:

COMPOSE_CONVERT_WINDOWS_PATHS=1
COMPOSE_PATH_SEPARATOR=|
COMPOSE_FILE=docker-compose.local.yml|project-1/docker-compose.yml|project-2/docker-compose.yml

这告诉 Docker 也运行那些子 project-1, project-2 通过它是 docker-compose.yml 和它是 .env 文件。

我希望每个项目都有一个自定义配置,因此我将以下配置添加到子项目 (/project-1/docker-compose.yml, /project-2/docker-compose.yml):

version: "2.4"
services:
  main-project-1:
    environment:
      - XDEBUG_MODE=${XDEBUG_MODE:-off}

如果我没有错,这意味着:如果变量 XDEBUG_MODE 未定义,则将其默认为 off,否则使用 .env 文件中定义的值。然后我配置了.env文件如下:

// project-2/.env
XDEBUG_MODE=on

由于某种原因,环境变量XDEBUG_MODE 被设置为off,即使我在.env 文件中将其设置为debug

我还尝试了以下方法:

version: "2.4"
services:
  main-project-1:
    environment:
      - XDEBUG_MODE=${XDEBUG_MODE}

但它再次设置为off

我不想在 .env 主文件中定义变量,因为我想赋予每个项目打开/关闭它的能力。我在这里可能缺少什么?

我已经阅读了here 以及互联网上其他人的帖子,但找不到我的问题的解决方案。

【问题讨论】:

    标签: docker docker-compose environment-variables


    【解决方案1】:

    你误解了docker-compose如何找到.env,见this

    Compose 支持在名为 .env 的环境文件中声明默认环境变量,该文件位于执行 docker-compose 命令的文件夹(当前工作目录)中。

    这意味着它会尝试在您运行docker-compose 命令的文件夹中查找.env,而不是您存储docker-compose.yaml 的文件夹。

    接下来证明一下:

    docker-compose.yaml:

    version: '3'
    services:
      app1:
        image: ubuntu:16.04
        environment:
          - XDEBUG_MODE=${XDEBUG_MODE:-off}
    

    .env:

    XDEBUG_MODE=on
    
    • 如果你在当前文件夹中运行docker-compose config,它会显示:

      services:
        app1:
          environment:
            XDEBUG_MODE: "on"
          image: ubuntu:16.04
      version: '3.0'
      
    • 如果你在它的父文件夹中运行docker-compose -f 20210108/docker-compose.yaml config(假设它的父文件夹是20200108),那么它会显示:

      services:
        app1:
          environment:
            XDEBUG_MODE: "off"
          image: ubuntu:16.04
      version: '3.0'
      

    最后,对于您的情况,正确的方法是 next:

    docker-compose.yaml:

    version: '3'
    services:
      app1:
        image: ubuntu:16.04
        tty: true
        stdin_open: true
        command: ["env"]
        environment:
          - XDEBUG_MODE=${XDEBUG_MODE:-off}
    

    .env:

    COMPOSE_PATH_SEPARATOR=|
    COMPOSE_FILE=docker-compose.yaml|project1/docker-compose.yaml
    

    project1/docker-compose.yaml:

    version: '3'
    services:
      app2:
        image: ubuntu:16.04
        tty: true
        stdin_open: true
        command: ["env"]
        env_file: project1/.env
    

    project1/.env

    XDEBUG_MODE=on
    

    输出:

    $ docker-compose config
    services:
      app1:
        command:
        - env
        environment:
          XDEBUG_MODE: "off"
        image: ubuntu:16.04
        stdin_open: true
        tty: true
      app2:
        command:
        - env
        environment:
          XDEBUG_MODE: "on"
        image: ubuntu:16.04
        stdin_open: true
        tty: true
    version: '3.0'
    

    注意:对于project1/docker-compose.yaml,下一步要删除,env_file 中的变量将直接被容器使用,如果在environment 中定义相同的变量,则不会扩展。其实并没有重新定义.env的路径,只是让env_file复用.env中的变量:

    environment:
      - XDEBUG_MODE=${XDEBUG_MODE:-off}
    

    【讨论】:

    • 只剩下一个疑问,我该如何使用在.env 主文件project-1/docker-compose.yml 中定义的环境变量?由于我将在该子项目中重新定义 env 文件,我仍然可以使用该子 docker 容器内的主 .env 文件中的环境变量?
    • 您仍然可以使用 environment: - ABC=${ABC} 来引用 main .env 中的另一个变量。事实上,docker-compose 会合并所有定义的docker-compose.yaml,所以下一级 compose 文件仍然可以访问 main .env。 docker-compose config 是内部结果最终的样子。
    猜你喜欢
    • 2018-07-30
    • 2019-06-22
    • 1970-01-01
    • 2021-02-18
    • 2016-03-20
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多