docker-compose在服务之间共享命名卷,并从特定目录读取/写入卷

时间:2020-02-27 09:15:33

标签: docker docker-compose

这可能是重复的,因为我认为这是docker-compose的常见用例。但是,在这种特定情况下,我似乎找不到类似的问题。

我有一个包含以下两项服务的docker-compose文件:

  processService:
    container_name: processservice
    image: mcr.microsoft.com/dotnet/core/sdk:3.1
    ports:
      - 5001:80
    volumes:
      - ./backend/packages/dotnet:/backend/packages/dotnet
      - ./backend/services/processService/src:/backend/services/processService/src
    working_dir: /backend/services/processService/src/ProcessService.Application
    command: dotnet watch run

  organizationService:
    container_name: organizationservice
    image: mcr.microsoft.com/dotnet/core/sdk:3.1
    ports:
      - 5002:80
    volumes:
      - ./backend/packages/dotnet:/backend/packages/dotnet
      - ./backend/services/organizationService/src:/backend/services/organizationService/src
    working_dir: /backend/services/organizationService/src/OrganizationService.Application
    command: dotnet watch run

从撰写文件中可以看出,我对两个服务使用相同的卷装载,即./backend/packages/dotnet:/backend/packages/dotnet

我想知道是否有可能在“卷”部分中声明一次该卷,然后在服务之间重用它。

我试图寻找答案。我遇到的答案建议使用docker volume create foo手动创建一个卷,然后按以下方式使用它:

...
volumes:
- foo:/backend/packages/dotnet
...

但是,这对我来说没有任何意义,因为当我在任何时候都未指定foo时,我看不出foo应该如何知道我希望它读取/写入的目录。

我尝试通读docker文档,但是找不到与创建装载特定目录的命名卷相关的任何内容。

有人对如何做到这一点有什么建议吗?

1 个答案:

答案 0 :(得分:0)

这是docker-compose文件中的两个不同的volumes部分:

  1. 本地(服务)

    本地volumes定位在服务部分中(就像在文件中一样),将数据量(或主机路径)映射到容器位置。

  2. 全局

    全局services:部分与volumes部分位于同一级别,并创建数据量。

然后,这是在docker-compose文件中使用数据卷的方法:

service1:
  volumes:
    - vol_1:location_1

service2:
  volumes:
    - vol_1:location_2

volumes:
  vol_1:

因此,在您的情况下,docker-compose部分应为:

  processService:
    container_name: processservice
    image: mcr.microsoft.com/dotnet/core/sdk:3.1
    ports:
      - 5001:80
    volumes:
      - dotnet:/backend/packages/dotnet
      - processService:/backend/services/processService/src
    working_dir: /backend/services/processService/src/ProcessService.Application
    command: dotnet watch run

  organizationService:
    container_name: organizationservice
    image: mcr.microsoft.com/dotnet/core/sdk:3.1
    ports:
      - 5002:80
    volumes:
      - dotnet:/backend/packages/dotnet
      - organizationService:/backend/services/organizationService/src
    working_dir: /backend/services/organizationService/src/OrganizationService.Application
    command: dotnet watch run


volumes:
  dotnet:
  processService:
  organizationService: