多个 docker compose 文件和共享卷

Multiple docker compose files and sharing volumes

提问人:Jagerber48 提问时间:4/6/2023 更新时间:4/6/2023 访问量:483

问:

我正在尝试设置一些docker compose文件,每个项目有一个compose文件。每个项目都有自己的文件夹,其中包含自己的 docker compose 文件。但是,我想要一种方便的方式来启动所有这些docker compose文件(它们之间可能存在依赖关系?我找到了一种使用关键字执行此操作的好方法(参见 https://docs.docker.com/compose/extends/)。但是我在共享卷方面遇到了一个小问题。extends

这个问题类似于在单独的 docker compose 文件之间共享卷,但我认为问题和答案可能是以前写的,可以包含在顶级卷部分定义的卷中,所以我认为答案现在可能会有所不同。问题也略有不同。这个重点是从顶级撰写文件启动多个撰写文件。name

我正在使用命名卷,以便卷由 docker 管理。此外,我不知道是首先调用顶级还是较低级别的撰写文件,因此我希望这两个文件都能够创建卷(如果尚不存在)。这意味着我不想为任一文件中的卷设置。external: true

我的代码大致是这样的。目录结构为:

Servers
|-- docker-compose.yaml
|-- project_1
|   |-- p1-docker-compose.yaml
|-- project_2
|   |-- p2-docker-compose.yaml

docker compose 文件内容为

# Servers/project_1/p1-docker-compose.yaml
version: '3.8'

services:
  service_1:
    image: image_1
    volumes: service_1_data

volumes:
  service_1_data:

# Servers/project_2/p2-docker-compose.yaml
version: '3.8'

services:
  service_2:
    image: image_2
    volumes: service_2_data

volumes:
  service_2_data:
# Servers/docker-compose.yaml
version: '3.8'

services:
  service_1:
    extends:
      file: project_1/p1-docker-compose.yaml
      service: service_1
  service_2:
    extends:
      file: project_2/p2-docker-compose.yaml
      service: service_2

volumes:
  service_1_data:
    name: project_1_service_1_data
  service_2_data:
    name: project_2_service_2_data

在顶级 docker compose 文件中,需要项目前缀,因为如果使用较低级别的 docker compose 文件创建卷,则会添加这些前缀。或者,我可以在所有较低和较高级别的 docker compose 文件中显式指定不带前缀的名称,这将产生类似的结果。

这一切实际上都有效。我可以使用较低级别或较高级别的 docker compose 文件启动容器,并且在所有情况下都使用相同的卷。

但是有一个小问题。假设我首先在文件夹中运行,使用顶级 docker compose 来启动容器。这也将创建名为 和 的卷。但是,如果我现在放下容器,然后进入并执行,容器将正常旋转并使用正确的体积,但我收到以下警告:docker compose up -dServersproject_1_service_1_dataproject_2_service_2_dataproject_1docker compose up -d

WARN[0000] volume "project_1_service_1_data" already exists but was not created for project "servers". Use `external: true` to use an existing volume 

此消息令人困惑,因为该卷实际上是为项目“服务器”创建的。它不是为项目“project_1”创建的。事实上,如果我这样做,我会看到docker volume inspect project_1_service_1_data

"com.docker.compose.project": "servers"

从本质上讲,问题是:

  1. 有没有办法配置这些撰写文件以避免收到上面显示的警告?
  2. 通常有没有更好的方法来使用 docker compose 来完成我在这里尝试做的事情?
docker-compose docker-volume

评论


答: 暂无答案