首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子环境变量不能正确设置,为什么?

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

Stack Overflow用户
提问于 2021-01-07 23:59:14
回答 1查看 137关注 0票数 1

我有一个“主”Docker项目,它会触发一些子项目,比如主docker-compose.yml.env文件。请参阅下面的目录结构,这样您就可以得到更好的想法:

代码语言:javascript
复制
`-- project/
    `-- docker-compose.yml/
        |-- .env
        |-- project-1/
        |   |-- docker-compose.yml
        |   `-- .env
        `-- project-2/
            |-- docker-compose.yml
            `-- .env

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

代码语言:javascript
复制
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)中:

代码语言:javascript
复制
version: "2.4"
services:
  main-project-1:
    environment:
      - XDEBUG_MODE=${XDEBUG_MODE:-off}

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

代码语言:javascript
复制
// project-2/.env
XDEBUG_MODE=on

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

我还尝试了以下几点:

代码语言:javascript
复制
version: "2.4"
services:
  main-project-1:
    environment:
      - XDEBUG_MODE=${XDEBUG_MODE}

但是,它再次被设置为off

我不想在主.env文件中定义变量,因为我希望能够为每个项目设置它。我在这里可能少了什么?

我在互联网上读过这里和其他人的帖子,但没有找到解决我的问题的办法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-08 02:17:49

如果您误解了docker-compose如何找到.env,请参阅

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

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

接下来要证明的是:

docker-compose.yaml:

代码语言:javascript
复制
version: '3'
services:
  app1:
    image: ubuntu:16.04
    environment:
      - XDEBUG_MODE=${XDEBUG_MODE:-off}

.env:

代码语言:javascript
复制
XDEBUG_MODE=on
  • 如果在当前文件夹中运行docker-compose config,它将显示: 服务: app1: environment: XDEBUG_MODE: on "on“图片: ubuntu:16.04版本:'3.0‘
  • 如果您在其父文件夹中运行docker-compose -f 20210108/docker-compose.yaml config (假设其父文件夹为20200108),那么它将显示: 服务: app1:环境: XDEBUG_MODE:“关闭”图片: ubuntu:16.04版本:'3.0‘

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

docker-compose.yaml:

代码语言:javascript
复制
version: '3'
services:
  app1:
    image: ubuntu:16.04
    tty: true
    stdin_open: true
    command: ["env"]
    environment:
      - XDEBUG_MODE=${XDEBUG_MODE:-off}

.env:

代码语言:javascript
复制
COMPOSE_PATH_SEPARATOR=|
COMPOSE_FILE=docker-compose.yaml|project1/docker-compose.yaml

project1/docker-compose.yaml:

代码语言:javascript
复制
version: '3'
services:
  app2:
    image: ubuntu:16.04
    tty: true
    stdin_open: true
    command: ["env"]
    env_file: project1/.env

project1/.env

代码语言:javascript
复制
XDEBUG_MODE=on

输出:

代码语言:javascript
复制
$ 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中重用变量。

代码语言:javascript
复制
environment:
  - XDEBUG_MODE=${XDEBUG_MODE:-off}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65621636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档