[Java] 难住高级工程师的容器化SpringBoot竟然启动一下后就退出

问题现象

容器化部署的,再普通不过的 Java SpringBoot程序,启动后打印一行日志后就退出了。

容器退出码:EXIT(1),无其他任何有效信息,logs日志目录也没任何一个文件生成。

分析

应该是什么类、Jar、文件找不到。

尝试

  • 修改容器启动命名: tail -f /dev/null
  • JVM 启动参数:-verbose:class
  • 抓取 JVM 错误:-XX:ErrorFile=/tmp/hs_err_pid%p.log -XX:+UnlockDiagnosticVMOptions

启动容器后进入容器控制台,然后手动启动应用程序,命令行之前追加strace

例如: strace -f -o /tmp/trace.log java -jar app.jar

分析 STRACE

verbose 打印输出:

....
93    stat("/home/hue/lib/org/springframework/boot/SpringBootExceptionHandler.class", 0x7fdb591fba10) = -1 ENOENT (No such file or directory)
93    lseek(653, 263287, SEEK_SET)      = 263287
93    read(653, "PK\3\4\24\0\0\10\10\0\201\275\322N\275\374\336\32\277\6\0\0I\16\0\09\0\0\0", 30) = 30
93    lseek(653, 263374, SEEK_SET)      = 263374
93    read(653, "\265Wiw\23\327\31~\306\2225\266<\306\262\203\r\230$\330\201\202-\33\\B\310\2\16\1\24/"..., 1727) = 1727
93    stat("/home/slankka/lib/org/springframework/boot/SpringBootExceptionHandler$LoggedExceptionHandlerThreadLocal.class", 0x7fdb591fb490) = -1 ENOENT (No such file or directory)

verbose:class 日志也刚好打印到这行 

最终原因

容器实际加载的 logback-spring.xml 缺少结尾的 </configuration> 闭合标签——它是非法 XML。

备注:这里是因为平台化的输入框导致的,输入框太小,不容易发现

为什么"打印错误的程序也退出"

logback 配置解析失败 → 日志系统本身初始化失败 → 控制台/文件 appender 一个都没建起来(trace 中从未创建 access.log 等文件)→ 后续 Spring 的启动异常无法打印("打印错误的程序也因为缺失而退出")→ 静默 exit_group(1)

为什么"能构建但运行退出"

仓库代码/构建是好的。坏的只是部署到容器里的那份覆盖配置, 这份配置是手动在平台覆盖的——在末尾的 </configuration> 丢了。所以本地/编译没问题,一上容器就挂。

  • 不是SpringBoot .conf配置文件语法问题
  • 不是依赖冲突
  • 不是连不上 Apollo/DB:全程零 TCP 连接,在联网前就挂了
  • 不是 JVM 崩溃exit_group(1) 是 Java 层 System.exit(1),无 hs_err 文件
posted @ 2026-08-31 11:13  一杯半盏  阅读(4)  评论(0)    收藏  举报