Spring Boot 2 應(yīng)用在 Docker 容器中異常退出(Exited(139)),如何排查并解決?

Spring Boot 2 應(yīng)用在 Docker 容器中異常退出(Exited(139)),如何排查并解決?

spring Boot 2 應(yīng)用在 docker 容器中異常退出的排查與解決

本文分析并解決spring boot 2應(yīng)用在Docker容器中異常停止(Exited(139))的問題。

問題描述:

centos 8.5系統(tǒng)上,使用Docker 19.03.13和Docker Compose部署了兩個(gè)Spring Boot 2應(yīng)用實(shí)例(pod1和pod2),均使用相同的Dockerfile和9G jvm內(nèi)存配置。pod2容器啟動(dòng)后立即異常停止,狀態(tài)顯示為Exited(139)。容器日志顯示最終錯(cuò)誤指向libawt.so,疑似缺少依賴。服務(wù)器內(nèi)存充足,GC日志未顯示內(nèi)存溢出。

Dockerfile分析:

Dockerfile基于openjdk:8-jdk-alpine-with-font鏡像,采用多階段構(gòu)建,最終鏡像包含應(yīng)用jar包及其依賴。Dockerfile已安裝字體庫ttf-dejavu和fontconfig,暗示應(yīng)用可能使用了圖形驗(yàn)證碼庫(例如hutool)。

排查步驟:

已執(zhí)行以下排查步驟:

  1. 查看Docker日志,錯(cuò)誤信息指向libawt.so。
  2. 檢查/usr/lib/jvm/Java-1.8-openjdk/lib/amd64目錄下的libjawt.so文件,發(fā)現(xiàn)其依賴庫libawt_xawt.so缺失。
  3. 確認(rèn)系統(tǒng)內(nèi)存充足。
  4. 檢查pod2容器的GC日志,未發(fā)現(xiàn)內(nèi)存溢出。
  5. 進(jìn)入pod1容器,查看Java版本信息。
  6. 對(duì)比本地和容器內(nèi)Java版本,發(fā)現(xiàn)版本差異。
  7. 對(duì)比本地和服務(wù)器Docker版本,差異較小,可能性較低。
  8. 查看/var/lib/messages系統(tǒng)日志,尋找更多線索。

問題分析與解決方案:

問題根源在于libawt.so及其依賴庫缺失。libawt.so是Java AWT庫的一部分,依賴X Window System提供圖形界面支持。openjdk:8-jdk-alpine鏡像精簡(jiǎn),默認(rèn)不包含X Window System相關(guān)庫。雖然安裝了ttf-dejavu和fontconfig,但僅支持字體渲染,不足以滿足AWT的圖形化需求。libawt_xawt.so缺失正是因?yàn)槿鄙賆 Window System環(huán)境。

解決方法:

  1. 安裝X Window System相關(guān)庫: 在Dockerfile中,除了ttf-dejavu和fontconfig,還需安裝xorg-x11-utils(或其他發(fā)行版的等效包),提供AWT所需的圖形環(huán)境。這會(huì)增加鏡像大小。
  2. 更換基礎(chǔ)鏡像: 使用包含完整圖形環(huán)境的OpenJDK鏡像,例如基于debian或CentOS的鏡像,避免繁瑣的依賴安裝。
  3. 分析hs_err_pid1.log: 該文件包含JVM崩潰的詳細(xì)信息,有助于精確定位問題。

通過以上方法,可解決Spring Boot應(yīng)用因缺少圖形化依賴導(dǎo)致的異常停止問題。 如果問題仍然存在,請(qǐng)?zhí)峁┩暾膆s_err_pid1.log文件以便進(jìn)一步分析。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊8 分享