start-period 是健康检查的启动缓冲期,docker 在此期间忽略所有失败且不计入重试;专为启动慢的服务设计,如 spring boot 或 postgresql,需根据实际启动耗时合理设置,宁长勿短。
start-period 是健康检查的“启动缓冲期”,不是等容器起来再开始检查,而是让 docker 在这段时间里忽略所有失败,不计入重试计数。
这个参数专为启动慢的服务设计。比如 Spring Boot 应用要加载上下文、连数据库、拉配置、预热缓存;PostgreSQL 要恢复数据、同步 WAL、完成主从握手——这些都不是秒级能完成的。如果一启动就开检,大概率立刻失败,还被算进 retries,导致容器刚起来就被标 unhealthy。
Web 类应用(Spring Boot / Node.js / Flask)
- 普通项目:30–60 秒
- 启动较重(含大量初始化逻辑或远程依赖):可设到 90 秒
- 不建议低于 20 秒,否则容易误判
数据库类容器(PostgreSQL / MySQL / Redis)
- 单机轻量部署:45–60 秒
- 带数据恢复、主从同步或大表加载:90–120 秒
- 若使用 initdb + restore 流程,建议观察实际启动日志耗时,再加 10–15 秒余量
配置要点与常见误区
- start-period 必须大于等于应用真实就绪时间,宁长勿短
- 它只影响“starting”阶段:状态保持 starting,不触发 restart,也不参与负载均衡
- 一旦过了 start-period,第一次检查失败就会开始计 retries
- 不要和 interval 混淆:start-period 是一次性宽限期,interval 是周期性间隔
- Docker Compose 中写成
start_period(下划线),Dockerfile 中是--start-period(短横线)
例如一个带数据库连接池和缓存预热的 Spring Boot 服务:
HEALTHCHECK --interval=30s --timeout=5s --start-period=60s --retries=3 \ CMD curl -f http://localhost:8080/actuator/health || exit 1
这表示:前 60 秒内任何失败都不算数;60 秒后,每 30 秒检查一次,5 秒没响应即失败,连续 3 次失败才标 unhealthy。
不复杂但容易忽略











