我有一个“主要” 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-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
。
接下来证明一下:
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'
最后,针对您的情况,下一步是正确的方法:
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
,您应该接下来删除,in中的变量env_file
将直接由容器使用,并且如果在中定义相同的变量,则不会展开environment
。实际上,它不是要重新定义的路径.env
,而只是env_file
要在.env
以下位置重用变量:
environment:
- XDEBUG_MODE=${XDEBUG_MODE:-off}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句