有时候需要在 compose.yml 容器服务编排描述文件内同时管理多个服务堆栈时,会显得非常冗长,此时为了方便维护和降低管理上的心智压力,可以通过引入 include 关键词来将服务堆栈拆分到子 yaml 文档中。
# tree
.
├── compose.yml
├── sub.d
├── env.prod
├── svc-01.yml
└── svc-02.yml
# cat ./compose.yml
# 定义全局公共环境变量
x-shared-env: &shared-env
TZ: ${TZ:-Asia/Shanghai}
# 创建网络堆栈
networks:
pub0:
name: pub0
driver: bridge
driver_opts:
com.docker.network.bridge.name: pub0
attachable: true
external: false
# 引入插件容器
include:
- ./sub.d/svc-01.yml # port: 10001/tcp
- ./sub.d/svc-02.yml # port: 10002/tcp
# 比较特殊的是子文件内的相对路径,还是指代相对于子文件所在的路径
#
# 在 docker swarm stack 拆分的 yaml 编排描述文件中则指代的是
# 执行 deploy 命令时,所在的当前目录
# 另外 dockker sawrm 的 yaml 文件暂不支持 include 关键词
# 然后就可以在子配置文件共用主编排描述文件内定义的网络堆栈了
# 另外暂时无法跨编排描述文件来引用预定义的环境变量
# cat ./sub.d/svc-01.yml
services:
service_01:
image: docker.io/helloworld:latest
container_name: service_01
hostname: service_01.docker.io
restart: unless-stopped
#environment:
# <<: *shared-env
env_file:
- ./env.prod
volumes:
- /etc/localtime:/etc/localtime:ro
networks:
- pub0
ports:
- "10001:8000/tcp"
#command: ["/venv/bin/uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
# 另外可配合 profiles 对这个 compose 堆栈进行分组,方便进行更细致的服务管理
# docker compose --profile svc-2 up -d
# docker compose --profile svc-2 down
# docker compose --profile logs
#
# cat ./sub.d/svc-02.yml
services:
service_02:
image: docker.io/helloworld:latest
container_name: service_02
hostname: service_02.docker.io
restart: unless-stopped
profiles: [ "svc-2" ]
#environment:
# <<: *shared-env
env_file:
- ./env.prod
volumes:
- /etc/localtime:/etc/localtime:ro
networks:
- pub0
ports:
- "10002:8000/tcp"
#command: ["/venv/bin/uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]