如何正确扩展其他项目的Docker Compose服务?网络报错求助
错误原因
当module_a通过extends继承module_b的服务时,会合并原服务的所有配置——包括原服务依赖的module_b-network。但module_a的compose文件中并没有定义这个网络,因此启动时会提示"undefined network module_b-network"。反过来给module_b服务添加module_a-network后,启动module_b时,它自己的compose文件也没有这个网络的定义,自然也会报错。
解决方法
方法1:在module_a中补全依赖的网络定义
直接在module_a的docker-compose.yml里添加module_b-network的定义,让Compose启动时自动创建这个网络:
# ./module_a/docker/docker-compose.yml version: "3" name: "module_a" networks: module_a-network: driver: bridge external: false module_b-network: # 新增该网络定义 driver: bridge external: false services: module_a: platform: linux/amd64 image: hello-world:latest networks: - module_a-network module_b: extends: file: ../module_b/docker/docker-compose.yaml service: module_b networks: - module_a-network
这种方式下,module_a里的module_b服务会同时连接module_a-network和module_b-network两个网络。
方法2:用!override完全覆盖原服务的网络配置(推荐)
如果只希望module_a里的module_b服务连接module_a-network,可以使用!override标记(需要Compose file 3.4及以上版本),完全替换原服务的网络配置,避免合并带来的依赖冲突:
# ./module_a/docker/docker-compose.yml version: "3" name: "module_a" networks: module_a-network: driver: bridge external: false services: module_a: platform: linux/amd64 image: hello-world:latest networks: - module_a-network module_b: extends: file: ../module_b/docker/docker-compose.yaml service: module_b networks: !override # 用!override替换原网络配置 - module_a-network
这种方式不需要修改module_b的配置,module_b单独启动时依然使用自己的module_b-network。
方法3:使用外部网络实现跨项目共享
如果需要两个项目的module_b服务共享同一个网络,可以先手动创建外部网络,再让两个项目引用它:
- 创建外部网络:
docker network create module_b-network
- 修改
module_b的docker-compose.yml,将module_b-network设为外部网络:
# ./module_b/docker/docker-compose.yml version: "3" name: "module_b" networks: module_b-network: driver: bridge external: true # 标记为外部网络,不自动创建 services: module_b: platform: linux/amd64 image: hello-world:latest networks: - module_b-network
- 修改
module_a的docker-compose.yml,引用该外部网络:
# ./module_a/docker/docker-compose.yml version: "3" name: "module_a" networks: module_a-network: driver: bridge external: false module_b-network: external: true # 引用已创建的外部网络 services: module_a: platform: linux/amd64 image: hello-world:latest networks: - module_a-network module_b: extends: file: ../module_b/docker/docker-compose.yaml service: module_b networks: - module_a-network
这样两个项目的module_b服务都会连接到同一个module_b-network,同时module_a的服务还能访问module_a-network。
内容的提问来源于stack exchange,提问作者juanp_1982

