Spring Boot 2 应用在 Docker 容器中异常退出(Exited(139)),如何排查并解决?

spring boot 2 应用在 docker 容器中异常退出(exited(139)),如何排查并解决?

Spring Boot 2 应用在 Docker 容器中异常退出的排查与解决

本文分析并解决Spring Boot 2应用在Docker容器中异常停止(Exited(139))的问题。

问题描述:

在CentOS 8.5系统上,使用Docker 19.03.13和Docker Compose部署了两个Spring Boot 2应用实例(pod1和pod2),均使用相同的Dockerfile和9G JVM内存配置。pod2容器启动后立即异常停止,状态显示为Exited(139)。容器日志显示最终错误指向libawt.so,疑似缺少依赖。服务器内存充足,GC日志未显示内存溢出。

Dockerfile分析:

Dockerfile基于openjdk:8-jdk-alpine-with-font镜像,采用多阶段构建,最终镜像包含应用jar包及其依赖。Dockerfile已安装字体库ttf-dejavu和fontconfig,暗示应用可能使用了图形验证码库(例如hutool)。

排查步骤:

AppMall应用商店 AppMall应用商店

AI应用商店,提供即时交付、按需付费的人工智能应用服务

AppMall应用商店 56 查看详情 AppMall应用商店

已执行以下排查步骤:

查看Docker日志,错误信息指向libawt.so。检查/usr/lib/jvm/java-1.8-openjdk/lib/amd64目录下的libjawt.so文件,发现其依赖库libawt_xawt.so缺失。确认系统内存充足。检查pod2容器的GC日志,未发现内存溢出。进入pod1容器,查看Java版本信息。对比本地和容器内Java版本,发现版本差异。对比本地和服务器Docker版本,差异较小,可能性较低。查看/var/lib/messages系统日志,寻找更多线索。

问题分析与解决方案:

问题根源在于libawt.so及其依赖库缺失。libawt.so是Java AWT库的一部分,依赖X Window System提供图形界面支持。openjdk:8-jdk-alpine镜像精简,默认不包含X Window System相关库。虽然安装了ttf-dejavu和fontconfig,但仅支持字体渲染,不足以满足AWT的图形化需求。libawt_xawt.so缺失正是因为缺少X Window System环境。

解决方法:

安装X Window System相关库: 在Dockerfile中,除了ttf-dejavu和fontconfig,还需安装xorg-x11-utils(或其他发行版的等效包),提供AWT所需的图形环境。这会增加镜像大小。更换基础镜像: 使用包含完整图形环境的OpenJDK镜像,例如基于Debian或CentOS的镜像,避免繁琐的依赖安装。分析hs_err_pid1.log: 该文件包含JVM崩溃的详细信息,有助于精确定位问题。

通过以上方法,可解决Spring Boot应用因缺少图形化依赖导致的异常停止问题。 如果问题仍然存在,请提供完整的hs_err_pid1.log文件以便进一步分析。

以上就是Spring Boot 2 应用在 Docker 容器中异常退出(Exited(139)),如何排查并解决?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/270428.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月4日 12:04:43
下一篇 2025年11月4日 12:05:14

相关推荐

  • c++中“undefined reference to”错误怎么解决_c++链接错误常见原因与修复方法

    undefined reference错误由链接器找不到函数或变量定义引起,常见原因包括:1. 函数声明后未定义;2. 源文件未参与编译链接;3. 类成员函数定义不匹配;4. 静态成员变量未在类外定义;5. 第三方库未正确链接;6. 命名空间作用域错误;7. C++调用C函数未用extern &#8…

    2025年12月19日
    000
  • c++如何实现继承和多态_c++继承多态操作方法

    继承和多态通过派生类复用基类成员并利用虚函数实现动态绑定,使同一接口调用不同实现,提升代码扩展性与维护性。 在C++中,继承和多态是面向对象编程的两个核心特性。它们让代码更易于复用、扩展和维护。下面详细介绍如何使用C++实现继承和多态,并提供实用的操作方法。 1. 继承的基本实现 继承允许一个类(派…

    2025年12月19日
    000
  • c++中如何编译和链接程序_c++程序编译与链接过程详解

    编译与链接过程包含预处理、编译、汇编和链接四阶段,依次处理宏替换、语法分析、生成汇编代码、转换为机器码并合并目标文件与库,最终生成可执行程序。 在C++中,编译和链接程序是将源代码转换为可执行文件的关键步骤。整个过程看似简单,实则包含多个阶段:预处理、编译、汇编和链接。理解这些阶段有助于排查错误、优…

    2025年12月19日
    000
  • c++智能指针shared_ptr和unique_ptr怎么用_c++智能指针使用指南

    答案:unique_ptr独占所有权,不可复制但可移动,适用于单一所有者场景;shared_ptr通过引用计数共享所有权,允许多个指针共享对象,需注意循环引用问题,推荐使用make_unique和make_shared创建,避免裸指针重复释放,正确使用可提升内存安全。 智能指针是 C++ 中管理动态…

    2025年12月19日
    000
  • c++怎么使用perf工具进行性能分析_c++ perf工具性能分析方法

    perf是Linux下C++性能分析利器,基于perf_events采样,无需修改代码即可定位热点函数与CPU瓶颈;需编译时加-g生成调试信息,用perf stat看整体指标,perf record/report分析函数级耗时,perf top实时监控,配合火焰图可直观展示调用栈。 C++ 程序性能…

    2025年12月19日
    000
  • C++在虚拟机中如何完成环境搭建

    答案:在虚拟机中搭建C++开发环境需选择虚拟机软件(如VirtualBox)、安装Linux系统(推荐Ubuntu LTS),安装增强工具后通过包管理器配置GCC、CMake、GDB等工具链,并选用VS Code或CLion等编辑器;其优势在于环境隔离、版本控制和快照恢复,避免依赖冲突,同时支持跨平…

    2025年12月19日
    000
  • c++中什么是虚函数_c++虚函数原理与用法详解

    虚函数实现C++运行时多态,通过基类指针调用派生类函数。1. 使用virtual声明虚函数,派生类用override重写;2. 底层通过vtable和vptr实现动态绑定,每个对象含vptr指向vtable,查找函数地址;3. 纯虚函数virtual func() = 0;使类成为抽象类,不可实例化…

    2025年12月19日
    000
  • c++怎么处理浮点数精度问题_c++浮点数精度问题处理方法

    浮点数精度问题源于二进制无法精确表示某些十进制小数,导致计算误差。应使用误差容差比较浮点数,避免直接用==;推荐采用相对误差判断方法。根据精度需求选择double(常用)、float或long double,优先使用double以减少误差累积。禁止依赖浮点运算的精确性,如用浮点数控制循环可能导致无限…

    2025年12月19日
    000
  • c++中什么是菱形继承问题_c++菱形继承问题解析

    菱形继承指C++中派生类通过多条路径继承同一基类,导致成员冗余和访问歧义。例如D继承B和C,而B、C均继承A时,若未使用虚继承,D将包含两份A的成员,引发二义性。解决方法是在B和C继承A时声明为虚继承(virtual public A),确保A在D中仅存在一个实例。此时最派生类D需直接调用A的构造函…

    2025年12月19日
    000
  • c++怎么使用valgrind检查内存问题_c++ Valgrind内存检测方法

    Valgrind是一款Linux下强大的C++内存调试工具,通过动态二进制插桩检测内存泄漏、非法访问和未初始化内存使用等问题。1. 可通过apt或yum等包管理器安装,并用valgrind –version验证。2. 编译时应添加-g选项生成调试信息,便于定位问题。3. 使用valgri…

    2025年12月19日
    000
  • c++怎么使用智能指针shared_ptr_c++ shared_ptr使用方法

    c++kquote>答案:std::shared_ptr通过引用计数管理对象生命周期,需包含头文件并启用C++11及以上标准;推荐使用std::make_shared创建,支持共享所有权与引用计数追踪,调用reset()可释放资源,通过*和->访问对象,但需注意避免循环引用导致内存泄漏,…

    2025年12月19日
    000
  • c++怎么调用C语言函数库_c++调用C函数库方法

    答案是使用extern “C”解决C++调用C函数的链接问题。通过在C++中用extern “C”包裹C头文件声明,或在C头文件中添加__cplusplus条件编译,确保C函数按C语言方式编译链接,再通过gcc编译C源码、g++编译C++主程序并链接目…

    2025年12月19日
    000
  • c++怎么避免伪共享问题_c++伪共享问题解决方法

    伪共享因多线程修改同缓存行不同变量引发性能下降,可通过内存填充、alignas对齐或线程局部存储避免,关键在于合理布局内存以减少缓存行竞争。 在C++多线程编程中,伪共享(False Sharing)是影响性能的一个常见问题。它发生在多个线程修改位于同一CPU缓存行中的不同变量时,导致缓存频繁失效,…

    2025年12月19日
    000
  • c++中如何使用shared_ptr管理对象_c++ shared_ptr使用方法

    shared_ptr通过引用计数自动管理对象生命周期,推荐使用make_shared创建,支持共享所有权与自定义删除器,需避免循环引用和裸指针重复构造,有效防止内存泄漏。 shared_ptr 是 C++11 引入的智能指针,用于自动管理动态分配对象的生命周期。它通过引用计数机制确保多个 share…

    2025年12月19日
    000
  • c++中如何调用父类同名函数_c++调用父类同名函数技巧

    使用作用域解析符可调用被重写的父类函数,如Base::func();当子类隐藏父类同名函数时,需用using引入父类重载;虚函数中可通过父类名调用实现扩展。 在C++中,当子类重写了父类的同名函数时,如果想在子类中调用父类的该函数,可以通过作用域解析运算符 :: 显式指定调用父类版本。这是最常见且安…

    2025年12月19日
    000
  • c++智能指针shared_ptr的实现原理_c++ shared_ptr实现原理

    shared_ptr通过引用计数和控制块实现共享所有权,use_count跟踪共享对象的指针数量,对象析构时自动释放资源;make_shared将对象与控制块内存合并,提升性能;多线程下引用计数操作原子安全,但共享对象访问需额外同步;循环引用导致内存泄漏,可用weak_ptr打破循环。 智能指针 s…

    2025年12月19日
    000
  • c++怎么从键盘读取一行字符串_c++键盘输入一行方法

    推荐使用std::getline函数读取整行字符串,它能安全读取含空格的输入并丢弃换行符;结合std::string使用最便捷。示例:#include #include using namespace std; int main() { string line; cout 在C++中,从键盘读取一整…

    2025年12月19日
    000
  • c++怎么解决循环引用的问题_c++ 循环引用解决方法

    使用weak_ptr打破循环引用是解决C++中shared_ptr导致内存泄漏的关键方法,通过将双向强引用改为单向shared_ptr加weak_ptr,避免引用计数无法归零;同时可通过减少双向依赖、使用原始指针、手动断开连接或引入管理类等方式解耦对象关系,确保资源正确释放。 在C++中,循环引用通…

    2025年12月19日
    000
  • c++怎么连接PostgreSQL数据库_c++ PostgreSQL数据库连接方法

    使用libpq库可实现C++连接PostgreSQL,需先安装开发包,编写代码建立连接并执行查询,编译时链接libpq库,或使用pqxx等高级封装库简化操作。 在C++中连接PostgreSQL数据库,通常使用官方提供的客户端接口库 libpq,它是PostgreSQL的C API。通过这个库,你可…

    2025年12月19日
    000
  • c++中怎么用cmake构建项目_CMake项目构建入门实践指南

    首先创建基本项目结构并编写CMakeLists.txt,接着通过mkdir build进入目录执行cmake ..和cmake –build .完成编译,最后根据需要添加多文件或子目录模块,注意设置正确路径与C++标准。 在C++开发中,使用CMake构建项目已成为行业标准。它跨平台、灵…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信