docker - 子环境变量没有正确设置,为什么?
问题描述
我有一个“主”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
debug
.env
我还尝试了以下方法:
version: "2.4"
services:
main-project-1:
environment:
- XDEBUG_MODE=${XDEBUG_MODE}
但它再次设置为off
。
我不想在主.env
文件中定义变量,因为我想赋予每个项目打开/关闭它的能力。我在这里可能会错过什么?
我在互联网上阅读了其他帖子,但找不到解决我的问题的方法。
解决方案
您误解了如何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}
推荐阅读
- javascript - 有没有一种方法可以概括一个组件以具有 props/onclick 功能而不为其他组件添加相同的东西
- javascript - SyntaxError:JSON 输入意外结束(获取错误)
- postgresql - ManyToOne / OneToMany - typeORM - postgresSQL
- python - 当我尝试在 django 中迭代 RawQuerySet 对象时,我得到“django.db.utils.ProgrammingError:无法适应类型'dict'”
- javascript - 如何将每个工作人员的结果 .push() 放入节点 js 中的数组中?
- html - jQuery UI Slide In 影响页面上的其他 div
- java - 拖动 ImageView 和绘图 - Android Studio 4.0
- macos - OSX终端命令使应用程序在启动时运行
- java - Unity 在 Java 中的 Mathf.PingPong
- android - 我正在使用 Firesbase 数据库并在尝试检索图像时出现存储异常