Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 子环境变量设置不正确,为什么?_Docker_Docker Compose_Environment Variables - Fatal编程技术网

Docker 子环境变量设置不正确,为什么?

Docker 子环境变量设置不正确,为什么?,docker,docker-compose,environment-variables,Docker,Docker Compose,Environment Variables,我有一个“main”Docker项目,它会触发一些子项目,尽管主Docker compose.yml和.env文件。请参阅以下目录结构,以便更好地了解: `-- project/ `-- docker-compose.yml/ |-- .env |-- project-1/ | |-- docker-compose.yml | `-- .env `-- project-2/ |

我有一个“main”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
// project-2/.env
XDEBUG_MODE=on
这告诉Docker也运行那些子
project-1、project-2
,通过它是
Docker compose.yml
,它是
.env
文件

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

如果我没有错,这意味着:如果未定义变量
XDEBUG\u MODE
,则将其默认为
off
,否则使用
.env
文件中定义的值。然后我将
.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
// project-2/.env
XDEBUG_MODE=on
出于某种原因,环境变量
XDEBUG\u MODE
被设置为
off
,即使我在
.env
文件中将其设置为
debug

我还尝试了以下方法:

version: "2.4"
services:
  main-project-1:
    environment:
      - XDEBUG_MODE=${XDEBUG_MODE}
但它再次被设置为
关闭

我不想在主
.env
文件中定义变量,因为我想为每个项目提供打开/关闭该变量的功能。我可能会错过什么


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

您误解了docker compose的方法。find
.env
,请参阅:

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}
XDEBUG_MODE=on
version: '3'
services:
  app1:
    image: ubuntu:16.04
    tty: true
    stdin_open: true
    command: ["env"]
    environment:
      - XDEBUG_MODE=${XDEBUG_MODE:-off}
COMPOSE_PATH_SEPARATOR=|
COMPOSE_FILE=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
$ 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'
.env:

version: '3'
services:
  app1:
    image: ubuntu:16.04
    environment:
      - XDEBUG_MODE=${XDEBUG_MODE:-off}
XDEBUG_MODE=on
version: '3'
services:
  app1:
    image: ubuntu:16.04
    tty: true
    stdin_open: true
    command: ["env"]
    environment:
      - XDEBUG_MODE=${XDEBUG_MODE:-off}
COMPOSE_PATH_SEPARATOR=|
COMPOSE_FILE=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
$ 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'
  • 如果在当前文件夹中运行
    docker compose config
    ,它将显示:

    services:
      app1:
        environment:
          XDEBUG_MODE: "on"
        image: ubuntu:16.04
    version: '3.0'
    
    services:
      app1:
        environment:
          XDEBUG_MODE: "off"
        image: ubuntu:16.04
    version: '3.0'
    
  • 如果在其父文件夹中运行
    docker compose-f 20210108/docker-compose.yaml config
    (假设其父文件夹为20200108),则它将显示:

    services:
      app1:
        environment:
          XDEBUG_MODE: "on"
        image: ubuntu:16.04
    version: '3.0'
    
    services:
      app1:
        environment:
          XDEBUG_MODE: "off"
        image: ubuntu:16.04
    version: '3.0'
    
最后对于您的案例,正确的方法是:

docker compose.yaml:

version: '3'
services:
  app1:
    image: ubuntu:16.04
    environment:
      - XDEBUG_MODE=${XDEBUG_MODE:-off}
XDEBUG_MODE=on
version: '3'
services:
  app1:
    image: ubuntu:16.04
    tty: true
    stdin_open: true
    command: ["env"]
    environment:
      - XDEBUG_MODE=${XDEBUG_MODE:-off}
COMPOSE_PATH_SEPARATOR=|
COMPOSE_FILE=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
$ 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'
.env:

version: '3'
services:
  app1:
    image: ubuntu:16.04
    environment:
      - XDEBUG_MODE=${XDEBUG_MODE:-off}
XDEBUG_MODE=on
version: '3'
services:
  app1:
    image: ubuntu:16.04
    tty: true
    stdin_open: true
    command: ["env"]
    environment:
      - XDEBUG_MODE=${XDEBUG_MODE:-off}
COMPOSE_PATH_SEPARATOR=|
COMPOSE_FILE=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
$ 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:

version: '3'
services:
  app1:
    image: ubuntu:16.04
    environment:
      - XDEBUG_MODE=${XDEBUG_MODE:-off}
XDEBUG_MODE=on
version: '3'
services:
  app1:
    image: ubuntu:16.04
    tty: true
    stdin_open: true
    command: ["env"]
    environment:
      - XDEBUG_MODE=${XDEBUG_MODE:-off}
COMPOSE_PATH_SEPARATOR=|
COMPOSE_FILE=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
$ 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'
项目1/.env

XDEBUG_MODE=on
输出:

version: '3'
services:
  app1:
    image: ubuntu:16.04
    environment:
      - XDEBUG_MODE=${XDEBUG_MODE:-off}
XDEBUG_MODE=on
version: '3'
services:
  app1:
    image: ubuntu:16.04
    tty: true
    stdin_open: true
    command: ["env"]
    environment:
      - XDEBUG_MODE=${XDEBUG_MODE:-off}
COMPOSE_PATH_SEPARATOR=|
COMPOSE_FILE=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
$ 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_文件
中的变量将直接由容器使用,如果您在
环境
中定义相同的变量,则不会展开。事实上,不需要重新定义
.env
的路径,只需让
env_file
重用
.env
中的变量即可:

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

还有一个疑问,我如何使用在
project-1/docker compose.yml
的主
.env
文件中定义的环境变量?由于我将在该子项目中重新定义env文件,因此我仍然能够使用该子docker容器中的main
.env
文件中的环境变量?您仍然可以使用
环境:-ABC=${ABC}
引用main.env中的其他变量。事实上,docker compose将合并所有定义的
docker compose.yaml
,因此下一级compose文件仍然可以访问main.env<代码>docker compose config是最终的内部结果。