Compose 重启策略是什么
restart 字段控制容器退出后是否被自动拉起。常用取值有四个:no 不自动重启;always 无论退出码如何都重启,宿主重启后也会拉起;on-failure[:max] 只在非零退出时重启,并可以限制最大次数;unless-stopped 与 always 类似,但被手动停止过的容器在 Docker 重启后不会被拉起。它只对『进程退出』生效,进程还活着但服务假死的情况要靠健康检查兜底。
基本信息
| 取值 | no / always / on-failure[:max] / unless-stopped |
|---|---|
| 关键差异 | always 在宿主重启后也拉起;unless-stopped 手动停过就不再拉起 |
| 查看方式 | docker inspect <容器> 的 HostConfig.RestartPolicy |
| 能力边界 | 只对进程退出生效,进程假死不会触发重启 |
| 与编排区别 | Swarm 使用 deploy.restart_policy,字段与语义都不同 |
典型使用场景
- 常驻 Web 服务与 API:用 unless-stopped,既能自愈又不被手动停止后的自动拉起干扰维护
- 任务型 worker:用 on-failure:5 限制重试次数,避免配置错误导致无限重启
- 本地开发环境:用 no,改代码或调试时不被自动拉起打断
- 宿主重启后需要自恢复的基础组件:监控采集、日志转发用 always
- 一次性任务容器:不设重启策略,跑完即退出是预期行为
示例与查看方式
示例与查看方式
services:
web:
image: nginx:1.27-alpine
restart: unless-stopped
worker:
restart: on-failure:5
# 查看某容器实际生效的策略
docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' <容器名>
# 查看重启次数与最后退出码
docker inspect -f '{{.RestartCount}} {{.State.ExitCode}}' <容器名>取值与行为对照
| 取值 | 正常退出 | 异常退出 | 手动停止后宿主重启 |
|---|---|---|---|
| no | 不重启 | 不重启 | 不重启 |
| always | 重启 | 重启 | 仍会拉起 |
| on-failure | 不重启 | 重启(可限次数) | 不重启 |
| unless-stopped | 重启 | 重启 | 保持停止状态 |
启动即崩的容器配上 always 会无限重启并把日志刷爆:先用日志定位根因,再换成 on-failure 并限制次数,避免把故障掩盖成噪音。
重启策略与健康检查是互补的:restart 处理进程退出,健康检查处理进程活着但服务不可用。只有两者配合,容器才具备真正意义上的自愈能力。