restart 字段是什么
restart 指定容器退出后是否自动拉起、拉起多少次,由 Docker 守护进程执行,与编排层无关。取值有 no、always、on-failure[:次数]、unless-stopped;YAML 里 no 必须加引号,否则会被解析成布尔假值导致校验报错。
基本信息
| 取值 | no、always、on-failure[:最大次数]、unless-stopped |
|---|---|
| 执行者 | Docker 守护进程,容器退出后由它决定是否重启 |
| 生产常用 | unless-stopped 与 on-failure |
| 手工停止 | 被手工 docker stop 的容器不会被策略重新拉起 |
| YAML 注意 | no 必须写成 "no" |
典型使用场景
- 长期运行的服务用 unless-stopped,宿主机重启后自动恢复
- 批处理任务用 on-failure:3,失败有限次重试后停下等人工介入
- 一次性任务用 "no",退出后保持在 Exited 状态方便查看退出码
- 排查反复重启时临时改成 "no",让容器停在失败现场再定位根因
- 与健康检查配合:检查只标记状态,真正的自愈要靠重启策略或编排
- 迁移到编排平台前把策略梳理清楚,避免两套自愈机制叠加
示例
示例
services:
api:
image: app/api:1.4.2
restart: unless-stopped # 生产常用,除手工停止外都自动拉起
batch:
image: app/batch:1.4.2
restart: on-failure:3 # 失败时最多重试三次
migrate:
image: app/migrate:1.4.2
restart: "no" # 不加引号会被当成布尔值四种策略的行为
| 取值 | 行为 | 适用场景 |
|---|---|---|
| no | 不自动重启 | 一次性任务、需要人工确认的失败 |
| always | 任何退出都重启,宿主重启后也拉起 | 常驻服务,但手工停止也会被重新拉起 |
| on-failure:3 | 非零退出码时重启,最多三次 | 可能偶发失败的批处理 |
| unless-stopped | 除手工停止外都拉起 | 生产常驻服务的常用选择 |
restart 由守护进程执行,不受 compose 启停命令影响;手工停止的容器不会因为策略被重新拉起,除非再次执行 up。
服务反复崩溃时配 always 会形成重启循环并刷满日志,先定位根因再决定策略,必要时临时改成 "no" 保留现场。
Swarm 与 Kubernetes 里容器的自愈由平台负责,restart 语义不同,迁移时这段配置需要重新评估而不是照搬。