排查 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 的构建过程,确保依赖正确安装和链接。此方法复杂且容易出错,不推荐。
其他考虑因素:
- 内存充足: 日志中提到服务器内存充足 (32G),因此内存不足并非问题根源。
- 多个容器: 使用两个 docker-compose 文件启动两个相同的应用,这本身并非问题,除非存在资源竞争。
- hs_err_pid1.log: 提供完整的 hs_err_pid1.log 文件将有助于更精确地定位问题。
总结:更换基础镜像是解决此问题的最有效和推荐的方法。 避免在精简镜像中添加大量图形化依赖,这会增加复杂性和维护难度。 选择合适的镜像可以确保应用在 Docker 中稳定运行。
以上就是SpringBoot2应用在Docker中异常停止,如何排查SIGILL(0x4)错误及libawt.so问题?的详细内容,更多请关注知识资源分享宝库其它相关文章!
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。