[英]How to set Docker Compose `env_file` relative to `.yml` file when multiple `--file` option is used?
我正在尝试将我的env_file
配置设置为相对于多个docker-compose.yml
文件位置中的每一个,而不是相对于第一个docker-compose.yml
。
文档( https://docs.docker.com/compose/compose-file/compose-file-v3/#env_file )表明这应该是可能的:
如果您使用 docker-compose -f FILE 指定了 Compose 文件,则 env_file 中的路径相对于该文件所在的目录。
例如,当我发出
docker compose \
--file docker-compose.yml \
--file backend/docker-compose.yml \
--file docker-compose.override.yml up
第二个(即backend/docker-compose.yml
)和第三个(即docker-compose.override.yml
)中的所有env_file
路径都相对于第一个文件的位置(即docker-compose.yml
)
我希望每个docker-compose.yml
文件中的env_file
设置都与定义它的文件相关。
这可能吗?
感谢您的时间
如果您对上下文感到好奇:
我想要一个自包含的后端存储库,后端开发人员可以在不需要前端容器的情况下对其进行处理。 前端 repo 将作为 Git 子模块拉入后端 repo,因为前端容器需要后端容器作为依赖项。 这是我的 2 个回购:
后端是这样组织的:
/docker-compose.yml
/docker-compose.override.yml
前端是这样组织的:
/docker-compose.yml
/docker-compose.override.yml
/backend/ # pulled in as a Git submodule
/backend/docker-compose.yml
/backend/docker-compose.override.yml
如果我将env_file
放在docker-compose.override.yml
文件中,一切正常。 后端的覆盖env_file
将相对于后端docker-compose.yml
。 并且前端的覆盖env_file
将相对于前端docker-compose.yml
。 前端永远不会使用后端的docker-compose.override.yml
。
但我想将后端的env_file
设置放入后端的docker-compose.yml
中,以便需要后端容器的项目可以继承并使用它的默认值。 如果依赖项目想要覆盖后端的env_file
,那么它可以在依赖项目的docker-compose.override.yml
中这样做。
我希望这是有道理的。
如果有另一种模式来组织处理这种情况的 Docker-Compose 项目,请告诉我。
事实证明,已经有一个关于这个的问题和讨论:
该线程指出这是预期的行为,并在此处记录: https://docs.docker.com/compose/extends/#understanding-multiple-compose-files
当您使用多个配置文件时,您必须确保文件中的所有路径都相对于基本 Compose 文件(使用 -f 指定的第一个 Compose 文件)。 这是必需的,因为覆盖文件不必是有效的 Compose 文件。 覆盖文件可以包含配置的小片段。 跟踪服务的哪个片段与哪个路径相关是困难且令人困惑的,因此为了使路径更易于理解,必须相对于基本文件定义所有路径。
该讨论中有一个非常有效的解决方法: https://github.com/docker/compose/issues/3874#issuecomment-470311052
解决方法是使用具有默认值的 ENV var:
- ${PROXY:-.}/haproxy/conf:/usr/local/etc/haproxy
或者在我的情况下:
env_file:
- ${BACKEND_BASE:-.}/.env
希望对其他人有帮助
如果有人对完整代码感兴趣: backend
的docker-compose.yml
: https://gitlab.com/starting-spark/porter/backend/-/blob/3.4.3/docker-compose.yml#L13-14
backend
的docker-compose.override.yml
: https://gitlab.com/starting-spark/porter/backend/-/blob/3.4.3/docker-compose.override.yml#L3-4
backend
的.env
: https://gitlab.com/starting-spark/porter/backend/-/blob/3.4.3/.env
frontend
的docker-compose.yml
: https://gitlab.com/starting-spark/porter/frontend/-/blob/3.2.2/docker-compose.yml#L5-6
frontend
的docker-compose.override.yml
: https://gitlab.com/starting-spark/porter/frontend/-/blob/3.2.2/docker-compose.override.yml#L3-4
frontend
的.env
: https://gitlab.com/starting-spark/porter/frontend/-/blob/3.2.2/.env#L16
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.