首页/云/Docker 容器速查/compose restart 策略字段
Compose 编排55 条

compose restart 策略字段

为服务设置自动重启策略:no/always/on-failure/unless-stopped,生产常配 unless-stopped 或 on-failure,并注意 YAML 引号。

Docker 容器速查云更新于 2026-10-13

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 语义不同,迁移时这段配置需要重新评估而不是照搬。

易错点

  • 把 no 写得不加引号,会被 YAML 解析成布尔值,compose 校验直接报类型错误
  • 常驻服务配成 always 后手工停不掉:停完又被拉起来,排查时容易误以为容器在异常重启
  • 指望重启策略解决依赖未就绪:依赖没起来时容器照样反复崩溃重启,问题要靠就绪等待与重试解决
  • 需要优雅关闭的服务没配停止宽限,重启循环中反复被强杀,可能留下损坏的数据文件

数据来源与参考

  • Docker 官方文档:Compose restart 参考与 restart policy(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌