有时候需要在 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"]

参考资料:
1、https://docs.docker.com/reference/compose-file/include/

dotterel-summer
最后修改:2025 年 12 月 16 日
如果觉得我的文章对你有用,请随意赞赏