docker-compose 在使用 `COMPOSE_FILE` 时忽略 .env 文件

docker-compose ignores .env file when using `COMPOSE_FILE`

我将所有 docker 内容保存在项目根目录下的 docker/ 子目录中,包括 docker-compose.yml.env.

当我运行:

$ docker-compose -f /path/to/my-project/docker/docker-compose.yml up -d

一切正常。但是,我想避免每次都必须指定 -f,所以我设置了 COMPOSE_FILE 变量:

$ export COMPOSE_FILE="/path/to/my-project/docker/docker-compose.yml"
$ docker-compose up -d
WARN[0000] The "DJANGO_DB_USER" variable is not set. Defaulting to a blank string. 
WARN[0000] The "DJANGO_DB_NAME" variable is not set. Defaulting to a blank string. 
WARN[0000] The "DJANGO_DB_PASSWORD" variable is not set. Defaulting to a blank string. 
WARN[0000] The "DJANGO_DB_PASSWORD" variable is not set. Defaulting to a blank string. 
...

不幸的是,与通过命令行指定相反,使用 COMPOSE_FILE 时不再使用 docker/.env 文件。

处理此问题的最佳做法是什么?我的主要目标是不必每次都输入很长的命令 运行 撰写命令。

我正在使用 docker-compose 版本 2.2.3

如果您使用 -f 标志指向撰写文件,.env 需要在撰写文件 旁边 。但是,如果您使用变量 COMPOSE_FILE,则 .env 需要位于 PWD,因此 在调用 compose CLI 的地方.

这就是为什么我倾向于将我的 .env 文件放在我的项目的根目录下并这样添加变量:

COMPOSE_PROJECT_NAME=my-project
COMPOSE_FILE=.docker/compose.yaml

项目名称变量很有用,因此 compose 不会仅命名项目 docker。如果在几个不同的项目中有此模式,则在不设置项目名称时最终会发生名称冲突。

这让我可以将所有 docker 相关的内容隐藏在它自己的目录中,并且仍然能够只做 docker compose up.

唯一的问题是你需要这个 env 文件或其他机制,如 direnv/.envrc 来让 compose 知道你想做什么。