Docker 子环境变量设置不正确,为什么?
我有一个“main”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/ |
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'
- 如果在其父文件夹中运行
(假设其父文件夹为20200108),则它将显示:docker compose-f 20210108/docker-compose.yaml 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'
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是最终的内部结果。