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

配置restart: always的Docker容器退出码1仍不自动重启如何排查?

可能的原因
  • 容器内zigbee2mqtt进程退出时出现死锁:从日志可见Failed to stop Zigbee2MQTT报错,老旧版本的zigbee2mqtt存在停止流程死锁的bug,主进程无法正常退出,docker会认为容器仍在运行,不会触发重启逻辑,等待超时后容器被强制杀死时部分场景下也会出现状态判断异常。
  • 串口挂载资源锁定:你挂载了/dev/ttyUSB1硬件设备,若该USB串口设备出现接触松动、驱动异常断开重连,会导致旧设备文件失效,容器退出时无法正常释放设备资源,docker无法完成容器的状态回收,进而不会触发重启。
  • Docker版本已知bug:你使用的Docker 19.03.7属于较早的版本,存在少量restart策略不生效的已知问题,比如异常退出的容器状态判断错误、资源占用时重启流程中断等。
  • 容器退出状态异常:若容器被OOM杀死、或者退出时产生僵尸进程残留,也会导致重启逻辑无法触发。
排查步骤
  1. 检查容器实际重启策略与状态
    执行命令查看容器的重启配置是否生效:
    docker inspect <你的zigbee2mqtt容器名/ID> | grep -A 5 RestartPolicy
    确认返回的Name字段为always,同时查看RestartCount字段数值是否有增长,判断docker是否尝试过重启容器。
    同时执行:
    docker inspect <你的zigbee2mqtt容器名/ID> | grep ExitCode
    确认容器的退出状态码,辅助判断退出原因。
  2. 检查进程残留
    执行ps aux | grep zigbee2mqtt查看是否有残留的容器进程,若存在僵尸/不可中断状态的进程,说明进程退出时卡住,导致容器状态异常。
  3. 查看硬件与系统日志
    执行dmesg查看是否有USB串口设备断开、重置的相关日志,确认是否是硬件设备不稳定导致的问题。同时查看docker daemon日志:
    journalctl -u docker --since "10分钟前"(可根据实际情况调整时间范围)
    查看容器崩溃时docker daemon是否有重启失败、资源释放错误的相关报错。
  4. 验证进程退出逻辑
    手动停止容器测试是否可以正常退出,执行docker stop <容器ID>看是否需要等待很久才会停止,若停止耗时超过默认的10s,说明进程确实存在退出死锁的问题。
解决方法
  • 升级zigbee2mqtt镜像版本:你使用的是2021年的老旧版本,升级到官方最新稳定版镜像,即可修复退出死锁的已知bug。
  • 调整容器停止超时配置:在docker-compose的zigbee2mqtt服务下添加stop_grace_period: 10s配置,指定容器停止的最大等待时间,超时后docker会强制杀掉异常进程,保证容器可以正常退出触发重启。
  • 修复硬件挂载问题:添加udev规则固定USB串口的设备路径,避免设备重连后路径变化,同时可以尝试在服务中添加privileged: true配置获取硬件访问的更高权限,减少设备资源锁定的概率。
  • 升级Docker版本:升级到20.10 LTS版本的Docker,修复旧版本重启策略相关的已知bug。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:36:01