假设有两个服务,并且它们定义了几个卷。但是这些卷中的大多数都在两种服务上使用:
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/