首页 > 解决方案 > 子环境变量没有正确设置,为什么?

问题描述

我有一个“主”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设置为,环境变量也会设置为。offdebug.env

我还尝试了以下方法:

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

但它再次设置为off

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

我在互联网上阅读其他帖子,但找不到解决我的问题的方法。

标签: dockerdocker-composeenvironment-variables

解决方案


您误解了如何docker-compose查找,.env参见:

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

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

接下来证明:

码头工人-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'
    

最后,对于您的情况,正确的方法是下一个:

码头工人-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

项目 1/docker-compose.yaml:

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

项目 1/.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,你应该删除next,其中的变量env_file将直接被容器使用,如果在中定义相同的变量,则不会扩展environment。实际上它不是重新定义的路径.env,只是让env_file变量重用.env

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

推荐阅读