排查 Spring Boot 2 应用在 Docker 中异常停止的问题
本文分析 Spring Boot 2 应用在 Docker 容器中异常停止,并返回 Exited(139)
状态码,日志显示 SIGILL (0x4)
和 libawt.so
相关错误的原因及解决方法。
问题症状:容器退出码为 Exited(139)
,日志包含 SIGILL (0x4) at pc=0x00007f78d6c50816
和 Problematic frame: C [libawt.so+0x2d816]
等信息。
问题根源分析:该问题可能与使用 HutTool 图形验证码和基础镜像选择有关。使用 openjdk:8-jdk-alpine
作为基础镜像,虽然添加了字体库 ttf-dejavu
和 fontconfig
,但该精简镜像缺少完整的图形化环境,特别是 AWT (Abstract Window Toolkit) 相关的库文件,例如 libawt_xawt.so
。 libawt.so
错误和 libjawt.so
加载失败正是由于缺少这些依赖导致的。
解决方法:
更换基础镜像: 避免使用精简的 openjdk:8-jdk-alpine
镜像。选择包含完整 Java 环境和 AWT 依赖的镜像,例如一个基于 Debian 或 CentOS 的镜像。这将直接解决依赖缺失问题。
(不推荐) 在 Dockerfile 中安装依赖: 如果必须使用 openjdk:8-jdk-alpine
,则需要在 Dockerfile 中添加安装 xorg-x11-utils
或其他必要 AWT 依赖的指令。但这会使镜像体积增大,并且可能需要仔细调整 Dockerfile 的构建过程,确保依赖正确安装和链接。此方法复杂且容易出错,不推荐。
其他考虑因素:
hs_err_pid1.log
文件将有助于更精确地定位问题。总结:更换基础镜像是解决此问题的最有效和推荐的方法。 避免在精简镜像中添加大量图形化依赖,这会增加复杂性和维护难度。 选择合适的镜像可以确保应用在 Docker 中稳定运行。