当使用多个“--file”选项时,如何设置 Docker Compose 相对于“.yml”文件的“env_file”?

A L*_*A L 9 git git-submodules docker docker-compose monorepo

我试图将我的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
Run Code Online (Sandbox Code Playgroud)

env_file第二个(即backend/docker-compose.yml)和第三个(即)中的所有路径docker-compose.override.yml都相对于第一个文件(即docker-compose.yml)的位置

我希望env_file每个docker-compose.yml文件中的设置都与其定义的文件相关。

这可能吗?

感谢您的时间

如果您对上下文感到好奇:

我想要一个独立的后端存储库,并且后端开发人员可以在不需要前端容器的情况下对其进行工作。前端存储库会将后端存储库作为 Git 子模块拉入,因为前端容器需要后端容器作为依赖项。这是我的 2 个仓库:

后端的组织方式如下:

/docker-compose.yml
/docker-compose.override.yml
Run Code Online (Sandbox Code Playgroud)

前端的组织方式如下:

/docker-compose.yml
/docker-compose.override.yml
/backend/ # pulled in as a Git submodule
/backend/docker-compose.yml
/backend/docker-compose.override.yml
Run Code Online (Sandbox Code Playgroud)

如果我将其放入文件env_file中,一切都会正常docker-compose.override.yml。后端的覆盖env_file将是相对于 backend 的docker-compose.yml。并且 frontend 的 overrideenv_file将是相对于 frontend 的docker-compose.yml。前端永远不会使用后端的docker-compose.override.yml.

但我想将后端的env_file设置放入后端docker-compose.yml,以便需要后端容器的项目可以继承并仅使用它的默认值。如果依赖项目想要覆盖后端的env_file,那么它可以在依赖项目的docker-compose.override.yml.

我希望这是有道理的。

如果有另一种组织 Docker-Compose 项目的模式来处理这种情况,请告诉我。

  • 我确实想避免单一回购。

A L*_*A L 3

事实证明,已经有一个关于此的问题和讨论:

该线程指出这是预期的行为,并记录在此处: https: //docs.docker.com/compose/extends/#understanding-multiple-compose-files

当您使用多个配置文件时,必须确保文件中的所有路径都相对于基本 Compose 文件(使用 -f 指定的第一个 Compose 文件)。这是必需的,因为覆盖文件不必是有效的 Compose 文件。覆盖文件可以包含配置的小片段。跟踪服务的哪个片段相对于哪个路径是困难且令人困惑的,因此为了使路径更易于理解,所有路径都必须相对于基本文件进行定义。

该讨论中有一个非常有效的解决方法: https://github.com/docker/compose/issues/3874#issuecomment-470311052

解决方法是使用具有默认值的 ENV 变量:

  • ${PROXY:-.}/haproxy/conf:/usr/local/etc/haproxy

或者就我而言:

  env_file:
    - ${BACKEND_BASE:-.}/.env
Run Code Online (Sandbox Code Playgroud)

希望对其他人有帮助

如果有人对完整代码感兴趣: backend的:https docker-compose.yml: //gitlab.com/starting-spark/porter/backend/-/blob/3.4.3/docker-compose.yml#L13-14
backenddocker-compose.override.ymlhttps ://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
frontenddocker-compose.yml: https: //gitlab.com/starting-spark/porter/frontend/-/blob/3.2.2/docker-compose.yml#L5-6
frontend ' s 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-火花/波特/前端/-/blob/3.2.2/.env#L16