假设有两个服务,并且它们定义了几个卷。但是这些卷中的大多数都在两种服务上使用:

version: '3'
services:
  service1:
    image: node:lts-alpine
    working_dir: /
    volumes:
      - ./package.json:/package.json
      - ./tsconfig.json:/tsconfig.json
      - ./packages:/packages
      - ./node_modules:/node_modules
      - ./services/service1:/services/service1
    command: yarn service1:start

  service2:
    image: node:lts-alpine
    working_dir: /
    volumes:
      - ./package.json:/package.json
      - ./tsconfig.json:/tsconfig.json
      - ./packages:/packages
      - ./node_modules:/node_modules
      - ./services/service2:/services/service2
    command: yarn service2:start

有办法防止这种重复吗?

我想做这样的事情:
version: '3'
services:
  service1:
    image: node:lts-alpine
    working_dir: /
    volumes:
      - myVolumeList
      - ./services/service1:/services/service1
    command: yarn start

  service2:
    image: node:lts-alpine
    working_dir: /
    volumes:
      - myVolumeList
      - ./services/service2:/services/service2
    command: yarn start

myVolumeList:
  - ./package.json:/package.json
  - ./tsconfig.json:/tsconfig.json
  - ./packages:/packages
  - ./node_modules:/node_modules

编辑:我仅将docker compose用于本地开发。卷对我来说很棒,因为更改源代码文件将自动重启我的服务。因此,仅复制文件是不够的

最佳答案

应用程序的代码通常应在Docker镜像中。您可以从同一镜像启动多个容器,可能使用不同的command:。例如,您可以编写如下的Dockerfile:

FROM node:lts-alpine
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn install
COPY ./ ./
CMD yarn start

描述了此图像之后,您可以在docker-compose.yml中引用它,并覆盖每种服务的command::

version: '3'
services:
  service1:
    build: .
    command: 'yarn service1:start'
  service2:
    build: .
    command: 'yarn service2:start'

(Compose可能会尝试为每个服务构建一个单独的镜像,但是由于Docker层缓存,“构建” service2镜像将非常快速地运行,并在同一镜像上添加第二个标签。)

此设置完全不需要绑定(bind)安装,如果将生成的镜像推送到Docker注册表,则可以在没有应用程序代码甚至Node可用的系统上运行它们。

关于docker - 如何将相同的卷应用于多个Docker Compose服务?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61547472/

10-16 16:56
查看更多