web 依赖 db,depends_on 也写了,起来还是报 dial tcp 172.18.0.3:5432: connect: connection refused,要重试好几次才连得上,冷启动必现,热重启反而没事,本地跑测试环境也一样。日志里能对上时间点,这种反而好排。

depends_on 只保证容器启动的先后顺序,不等里面进程真正可用,db 初始化还要几秒,这期间连接必然被拒,和网络配置没关系,应用侧必须自己兜底。这一点先确认清楚,后面就不用反复试。

services:
  db:
    healthcheck:
      test: ['CMD', 'pg_isready', '-U', 'postgres']
      interval: 5s

这次卡住的地方就在「compose 启动顺序」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

处理上按这个顺序:给依赖服务加上 healthcheck 启动条件配成 service_healthy 再起 别只写 depends_on 顺序问题就别猜了;应用侧保留启动重试逻辑 不能只靠启动顺序 多等两秒没关系;初始化比较慢的服务 把探针间隔和重试次数适当调长。

结果对不对很好判断,冷启动一次不再出现 connection refused,服务等到健康后连上,日志里能看到连接成功。

作者 9823189