Skeyevss FAQ:Docker Compose 启动顺序与健康检查
1. 问题现象
docker compose up 后部分容器反复重启;业务日志报数据库连接失败、etcd 未就绪;或第一次启动正常,机器重启后必现故障。
2. 依赖顺序的本质
微服务启动时若 早于 MySQL/Redis/etcd 开始建连,会在重试耗尽后退出。Compose v2 的 depends_on 默认只保证 容器启动顺序,不保证 进程已监听端口。
3. 推荐做法
- 在依赖服务上配置 healthcheck(例如 MySQL
mysqladmin ping、Redisredis-cli ping、etcdetcdctl endpoint health); - 业务服务
depends_on使用 condition: service_healthy(语法以当前 Compose 文件版本为准); - 应用侧保留 指数退避重试,防止依赖短暂抖动导致雪崩。
4. 环境变量与挂载
.env是否通过env_file或environment注入到每个服务;- 配置文件目录
etc/是否挂载一致,避免容器内路径与文档描述不符; - 数据卷权限:非 root 用户进程可能无法写 SQLite 或日志目录。
5. 排障命令习惯
docker compose ps看状态与退出码;docker compose logs <service> --tail 200看启动失败栈;- 进入容器
nc -zv host port测连通性。
启动问题多数是 「依赖未就绪」与「配置未注入」 两类,按日志时间线从上到下读一遍通常即可定性。