如何在覆盖的docker compose配置文件中取消network_mode设置?
Docker Compose 双文件覆盖取消network_mode配置方案
直接重置字段方案(适用于较新Compose版本)
Docker Compose 1.27.0+ 及 Docker Compose V2 版本支持!reset YAML标签,可直接清除从基础配置继承的字段值,等同于从未配置过该字段,写法如下:
services: foo: ports: - 'xxxx:yyyy' network_mode: !reset
该配置生效后,Compose会使用默认的网络逻辑,不会继承基础文件中的host网络配置。
解决bridge模式下服务无法互通问题
你之前设置network_mode: bridge后服务无法连接Redis,是因为Docker默认网桥不支持服务名DNS解析,同网桥下的服务无法通过服务名互相访问。只需在基础配置中显式声明自定义网桥即可解决:
基础配置文件 docker-compose.yml(默认开发环境)
version: '3' services: foo: image: bar network_mode: host redis: image: redis:alpine network_mode: host celery: image: your-celery-image network_mode: host # 声明自定义网桥供生产环境使用 networks: app_internal: driver: bridge
生产覆盖配置文件 docker-compose.prod.yml
services: foo: ports: - 'xxxx:yyyy' network_mode: !reset networks: - app_internal redis: network_mode: !reset networks: - app_internal celery: network_mode: !reset networks: - app_internal
生产环境启动命令:docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
此时所有服务都加入自定义网桥,可通过服务名正常互相访问。
低版本Compose兼容方案
如果你使用的Compose版本不支持!reset标签,可调整配置文件层级实现双文件逻辑:
- 把所有环境通用的无差异配置放在
docker-compose.yml中,不包含network_mode相关配置 - 开发环境特殊配置放在
docker-compose.override.yml中,写入network_mode: host配置,该文件是Compose默认自动加载的覆盖文件,开发环境直接执行docker compose up即可生效host网络 - 生产环境特殊配置放在
docker-compose.prod.yml中,写入端口映射等配置,生产环境执行docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d即可,不会加载override文件,自然不会继承host网络配置,无需额外重置字段
内容的提问来源于stack exchange,提问作者Kacperito
相关产品推荐
相关产品推荐

