You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何on-failure策略未重启退出码为137的Docker容器?

问题原因解析

首先明确几个核心关键点:

  • 退出码137的本质:137 = 128 + 9,其中9对应Linux的SIGKILL信号,说明容器是被外部强制终止的,而非自身进程因错误崩溃退出。
  • restart: on-failure的触发逻辑:这个策略仅针对容器自身进程因错误主动退出的场景——比如应用代码抛出未捕获异常、进程崩溃导致的非零退出码(比如1、2等)。当容器是被外部信号(如docker stop、CTRL+C触发的SIGINT/SIGKILL)终止时,Docker会判定这是用户主动操作,不会触发on-failure的重启规则。

你用docker compose up后按CTRL+C的具体过程是:

  1. CTRL+C发送SIGINT给docker-compose进程;
  2. docker-compose先向容器发送SIGTERM信号尝试优雅终止;
  3. 如果容器在默认10秒超时时间内未退出,docker-compose会发送SIGKILL强制杀死容器,此时容器退出码为137;
  4. 由于这是外部主动终止操作,不符合on-failure的触发条件,因此容器不会被重启。

如果需要在外部终止后也重启容器,可以改用以下策略:

  • restart: always:无论容器因何种原因退出(除了手动执行docker stop),都会自动重启;
  • restart: unless-stopped:和always类似,但如果是手动执行docker stop终止的容器,不会自动重启。

内容的提问来源于stack exchange,提问作者user22155685

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:12:36