报数据库连不上?Docker Compose 启动顺序假象:depends_on 不是万能的!

📖 背景

服务器重启后。大屏(Flask)总是报错 Connection refused。看日志:Can't connect to MySQL server on 'db'。

执行 docker compose up -d 也是一样。明明写了 depends_on: - db。db 容器明明在运行。

🔍 原因

小学生版解释:

depends_on 就像比赛时的"排队"。它只保证跑道上 db 先跑,dashboard 后跑。

但 db(MariaDB)是个大胖子。跑到起跑线后,还要花 5 秒系鞋带(初始化数据库、监听端口)。

dashboard 跑得飞快,起跑后直接敲门,发现 db 还没弄好,立刻报错退出。

🛠 解决

不能用 depends_on。要用 healthcheck(健康检查)+ condition: service_healthy。

修改 docker-compose.yml:

复制代码
services:
  db:
    image: mariadb
    healthcheck:
      # 只要 docker 内执行该命令成功,才算健康
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 5s
      timeout: 3s
      retries: 5

  dashboard:
    image: flask-app
    depends_on:
      db:
        condition: service_healthy # 关键:等 db 健康了再启动

改完执行 docker compose up -d 重建。

✅ 验证效果

用 docker ps 观察。

注意看 STATUS 这一列:db 变成 Up (healthy) 之前,dashboard 会显示 Created 或 Waiting。一旦 db 变绿(healthy),dashboard 才会启动。

大屏不报错了。

💣 三个坑

老版本 Compose 不认:如果你的 docker compose 版本很老(V2 以下),可能不支持 condition: service_healthy,必须升级 compose 插件。

健康检查命令写错:test 里的命令如果没有指定 CMD 或者写错,容器永远 unhealthy,导致后端永远起不来。

不写超时退出:如果不配合 restart: always(重启策略),一旦后端起太快报错退出,它就不会自己重试了。

相关推荐
Vex2une1 小时前
WSL2 Docker开发环境:2026年容器化编程性能调优指南
docker·开发环境·wsl2·容器化开发·virtiofs·dev drive·gpu直通
梅孔立1 小时前
.mdb Access_MDB历史数据文件迁移MySQL实战教程-可直接投喂给ai参考这个帮你完成迁移
数据库·mysql·adb
我滴老baby1 小时前
自建服务20个,书签300条?我用一个Docker容器做了个“服务启动台”,手机也能打开
运维·docker·容器
lwx9148521 小时前
Docker容器模拟主机
运维·docker·容器
时间售卖铺2 小时前
MySQL 数据库账户及授权
运维·数据库·mysql·云原生
l1t2 小时前
pgrust v0.4-beta 安装和查询测试
数据库·postgresql·rust·duckdb·pgrust
SelectDB技术团队2 小时前
SelectDB 架构演进与 ClickHouse 迁移指南
大数据·数据库·clickhouse·云原生·架构·数据分析·apache doris
java_logo2 小时前
Docker 部署 MaxKB:轻松搭建企业级智能体平台
运维·docker·容器·知识库·智能体·maxkb·轩辕镜像
java_nnnn2 小时前
分布式系统进阶:数据库分库分表、微服务与架构演进总结
数据库·redis·微服务·架构