问题
执行 docker compose up -d 启动后,docker ps 显示所有容器均为 Up 状态,但访问网站却返回 502。
Flask 日志:
Can't connect to MySQL server on 'db'
原因
Up ≠ 能用。
MariaDB 启动后要 20-30 秒加载数据、建索引。这段时间容器是 Up,但连不上。
而 depends_on 默认只等容器创建完成,不等它真的能干活——所以 Flask 启动时数据库还没好。
解决
给数据库加 healthcheck,让 Flask 等它健康了再启动。
1. MariaDB 加健康检查
db:
image: mariadb:latest
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
healthcheck:
test: ["CMD-SHELL", "mariadb-admin ping -h localhost -u root -p${DB_ROOT_PASSWORD} || exit 1"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s # 宽限期,避免误判
2. Flask 等它健康
dashboard_a:
build: .
depends_on:
db:
condition: service_healthy # 关键
3. 重启验证
docker compose down && docker compose up -d
docker compose ps
启动时会看到 my-mariadb (health: starting),30 秒后变 (healthy),Flask 才开始启动。
顺便:零停机滚动更新
有了健康检查,更新时可以逐个来:
# 先更新 A,B 继续扛流量
docker compose up -d –no-deps –build dashboard_a
# 等 A 健康后,再更新 B
docker compose up -d –no-deps –build dashboard_b
三个坑
坑 1:Up 是"进程活着",healthy 才是"能干活"。
坑 2:忘了 start_period,MariaDB 启动时的失败会被误判为 unhealthy,容器反复重启。
坑 3:healthcheck 里别硬编码密码,用 ${DB_ROOT_PASSWORD} 变量引用。

