[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 文件

浙公网安备 33010602011771号