on-failure:N 是唯一能限制重试次数的重启策略,显式指定数字(如 on-failure:3)可严格限制异常退出后的重启次数,超限即停止尝试;默认值不一致且不可靠,应始终显式配置。
用 on-failure:max-retries 限制重试次数,是最直接有效的方式。它不是靠“restart-max”这个独立参数,而是把最大重试数写在 --restart=on-failure:n 的冒号后面。
为什么 on-failure:N 能防止无限重启
容器一旦崩溃(退出码非 0),Docker 守护进程就会按策略响应。on-failure 只对异常退出敏感,且明确支持上限控制:
- 不设数字(如
on-failure)默认最多重试 5 次(部分版本为 10 次,行为不一致) - 显式指定数字(如
on-failure:3)就严格限制为该次数,超限后容器状态变为exited并停止尝试 - 正常退出(状态码 0)完全不触发重启,哪怕你写了
on-failure:100
实际配置要点
启动时带上带数字的 on-failure,是防资源耗尽的关键操作:
- 基础命令:
docker run -d --restart=on-failure:3 --name app nginx:alpine - 建议始终指定数字,避免依赖默认值带来的不确定性
- 数值选 3~5 较常见:足够捕获瞬时故障,又不会让反复崩溃的应用长期占满 CPU 或日志磁盘
- 搭配健康检查(
--health-cmd)可进一步提升判断准确性,但重启动作仍由 exit code 和 on-failure 规则驱动
别混淆其它策略
always 和 unless-stopped 都不看退出码,也不接受重试次数限制,它们会无限重启——这正是你要避免的:
-
--restart=always:容器一退出就拉起,不管是不是刚启动 2 秒就 panic -
--restart=unless-stopped:连宿主机重启后也会自启,手动 stop 前永不停止 - 只有
on-failure:N同时满足“只响应异常”+“硬性计数封顶”两个条件
验证与调整方法
运行后快速确认是否生效:
- 查策略:
docker inspect app | jq '.[0].HostConfig.RestartPolicy',输出应含"Name": "on-failure", "MaximumRetryCount": 3 - 模拟崩溃:
docker exec app sh -c 'kill 1',观察docker ps -a中重启次数是否卡在 3 次后停住 - 若需调整,可用
docker update --restart=on-failure:5 app动态更新(无需重建容器)











