Docker 容器一直重启还不打印日志:退出码与前台进程两本账
直接答案:容器反复重启,先看退出码定性质;“看不到日志"则几乎都栽在同一个习惯上——把服务以后台守护方式启动,主进程秒退,容器跟着退出,重启策略又把它拉起来,循环往复,而你以为在跑的服务日志早随着退出丢掉了。两本账分开算,问题就清楚。
第一本账:退出码定性质
docker ps -a 看容器的退出码,是判别方向的第一步:退出码 0 是正常结束——配合反复重启,基本可断定主进程"干完就退”(典型如后台化启动脚本);退出码非 0(1、125、137 等)是异常退出——137 常见于内存超限被杀,125 附近多是启动命令本身有误。退出码加上 docker logs 里最后几行,多数启动期错误当场现形:配置文件路径不对、端口被占、依赖服务连不上,都在启动日志里。
第二本账:前台进程是容器的命根子
容器的生存逻辑是"主进程活着,容器才活着"。服务以后台方式启动后,启动脚本本身退出了,容器眼里主进程已死,于是退出——重启策略拉起、再次退出、无限循环。这正是"一直重启还没日志"的标准剧本:日志其实打在了容器里的后台文件中,主进程的 stdout 反而是空的。解法是把服务改回前台运行:多数服务有前台参数(配置里的守护进程开关关掉),或者用入口脚本最后一条命令以 exec 方式启动服务,让服务进程顶替脚本成为主进程——进程树理顺,容器状态与日志就都正常了。
辅助排查两招
一是 docker logs -f 跟着重启窗口看:反复重启时日志会被截成多段,加上时间戳看最后一段的结尾就是死因。二是临时去掉重启策略手动 run 一次:没有自动重启的干扰,退出现场干净完整,配合 docker inspect 看退出状态与 OOM 标记,内存超限类问题一查便知。
收口
排查顺序:先看退出码分正常/异常,异常查启动日志修配置,正常查主进程是否前台化;修完以"容器状态持续 Up、日志持续滚动"为验收标准。贵州诚鑫致达科技帮企业容器化业务时,交付清单里固定有一条"主进程前台化+日志落 stdout"的规范——容器日志看得见,重启循环这类问题从第一天就不会发生。
企业存储选型参考|贵州诚鑫致达
做海量监控接入与长期归档,群晖机型参考:HD6500 · RS3621xs+ · DS2422+。需要选型建议或上门评估,搜「诚鑫致达」即可找到我们。