配置restart: always的Docker容器退出码1仍不自动重启如何排查?
可能的原因
- 容器内zigbee2mqtt进程退出时出现死锁:从日志可见
Failed to stop Zigbee2MQTT报错,老旧版本的zigbee2mqtt存在停止流程死锁的bug,主进程无法正常退出,docker会认为容器仍在运行,不会触发重启逻辑,等待超时后容器被强制杀死时部分场景下也会出现状态判断异常。 - 串口挂载资源锁定:你挂载了
/dev/ttyUSB1硬件设备,若该USB串口设备出现接触松动、驱动异常断开重连,会导致旧设备文件失效,容器退出时无法正常释放设备资源,docker无法完成容器的状态回收,进而不会触发重启。 - Docker版本已知bug:你使用的Docker 19.03.7属于较早的版本,存在少量restart策略不生效的已知问题,比如异常退出的容器状态判断错误、资源占用时重启流程中断等。
- 容器退出状态异常:若容器被OOM杀死、或者退出时产生僵尸进程残留,也会导致重启逻辑无法触发。
排查步骤
- 检查容器实际重启策略与状态
执行命令查看容器的重启配置是否生效:docker inspect <你的zigbee2mqtt容器名/ID> | grep -A 5 RestartPolicy
确认返回的Name字段为always,同时查看RestartCount字段数值是否有增长,判断docker是否尝试过重启容器。
同时执行:docker inspect <你的zigbee2mqtt容器名/ID> | grep ExitCode
确认容器的退出状态码,辅助判断退出原因。 - 检查进程残留
执行ps aux | grep zigbee2mqtt查看是否有残留的容器进程,若存在僵尸/不可中断状态的进程,说明进程退出时卡住,导致容器状态异常。 - 查看硬件与系统日志
执行dmesg查看是否有USB串口设备断开、重置的相关日志,确认是否是硬件设备不稳定导致的问题。同时查看docker daemon日志:journalctl -u docker --since "10分钟前"(可根据实际情况调整时间范围)
查看容器崩溃时docker daemon是否有重启失败、资源释放错误的相关报错。 - 验证进程退出逻辑
手动停止容器测试是否可以正常退出,执行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
相关产品推荐
相关产品推荐

