docker stop --time(或-t)指定sigterm到sigkill的宽限期,默认10秒,需应用自身捕获sigterm并完成清理,否则超时强杀;退出码0为优雅退出,137表示被sigkill终止。
使用 docker stop --time 可以控制容器在收到 sigterm 信号后、强制发送 sigkill 前的等待时长,从而为应用预留足够的优雅停机时间。
理解 --time 参数的实际作用
--time(或简写为 -t)指定的是从发送 SIGTERM 到最终执行 SIGKILL 的总超时秒数,默认为 10 秒。它不改变信号发送行为,只调整“宽限期”长度。容器内主进程需自行捕获 SIGTERM 并完成清理(如关闭连接、刷盘、退出队列等),否则超时后会被强制终止。
正确设置 --time 的常见场景
- Web 服务(如 Nginx、Spring Boot):设为 30–60 秒,确保活跃请求处理完毕、连接自然断开
- 数据库代理或消息队列客户端:设为 15–30 秒,用于提交未确认消息、释放资源
- 批处理任务容器:若已知最长清理耗时为 120 秒,可设
--time=120避免中途被杀 - 调试时临时延长:如
docker stop -t 300 myapp给足 5 分钟观察日志和状态
配合应用代码才能真正实现优雅停机
--time 只是外部倒计时,真正起作用的是容器内进程是否响应 SIGTERM。例如:
- Node.js 应用需监听
process.on('SIGTERM', ...)并调用server.close() - Java 应用(Spring Boot)默认支持
SIGTERM,但需启用spring.lifecycle.timeout-per-shutdown-phase等配置 - Go 程序应使用
signal.Notify捕获syscall.SIGTERM,再触发 graceful shutdown 流程 - 若主进程忽略
SIGTERM(如某些 shell 启动的脚本),--time再长也无效,会直接超时强杀
验证优雅停机是否生效
可通过日志和退出码判断:
- 正常优雅退出:容器日志末尾出现清理完成提示,
docker inspect myapp | grep "Status"显示"Status": "exited"且退出码为 0 - 被强制终止:日志中断在清理中途,退出码为 137(即 128 + 9,对应
SIGKILL) - 测试命令:
docker stop -t 5 myapp && docker logs myapp,观察最后几行是否包含预期的 shutdown 日志











