为何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的具体过程是:
- CTRL+C发送
SIGINT给docker-compose进程; docker-compose先向容器发送SIGTERM信号尝试优雅终止;- 如果容器在默认10秒超时时间内未退出,
docker-compose会发送SIGKILL强制杀死容器,此时容器退出码为137; - 由于这是外部主动终止操作,不符合
on-failure的触发条件,因此容器不会被重启。
如果需要在外部终止后也重启容器,可以改用以下策略:
restart: always:无论容器因何种原因退出(除了手动执行docker stop),都会自动重启;restart: unless-stopped:和always类似,但如果是手动执行docker stop终止的容器,不会自动重启。
内容的提问来源于stack exchange,提问作者user22155685
相关产品推荐
相关产品推荐

