SpringBoot2應(yīng)用在Docker容器中異常退出(Exited 139)是什么原因?

SpringBoot2應(yīng)用在Docker容器中異常退出(Exited 139)是什么原因?

排查 spring Boot 2 應(yīng)用在 docker 容器中異常退出的問題 (Exited 139)

本文分析 spring boot 2 應(yīng)用在 Docker 容器中異常停止,并提供解決方案。 問題表現(xiàn)為容器狀態(tài)顯示為 Exited (139),日志包含 SIGILL (0x4) 錯(cuò)誤,以及指向 libawt.so 的錯(cuò)誤信息。

根據(jù)提供的 Dockerfile、docker-compose 文件和日志,問題可能源于圖形驗(yàn)證碼庫和基礎(chǔ)鏡像的依賴缺失。 應(yīng)用使用了需要 Java AWT 庫的圖形驗(yàn)證碼庫,而 openjdk:8-jdk-alpine 鏡像精簡,缺失 libawt_xawt.so 等 AWT 庫文件。 雖然已安裝字體庫,但仍未解決 AWT 庫缺失問題。 ldd 命令也證實(shí)了 libawt_xawt.so 缺失。 AWT 庫缺失導(dǎo)致圖形化操作時(shí)出現(xiàn) SIGILL (非法指令) 異常,最終導(dǎo)致容器退出。

雖然 Exited (139) 也可能與內(nèi)存不足等有關(guān),但結(jié)合 libawt.so 錯(cuò)誤信息,更可能是依賴庫缺失導(dǎo)致程序崩潰。 服務(wù)器內(nèi)存充足,內(nèi)存不足可能性較小。

建議嘗試以下方法:

  1. 更換基礎(chǔ)鏡像: 使用包含完整 AWT 支持的鏡像,例如基于 debiancentos 的 OpenJDK 鏡像,直接解決 AWT 庫缺失。

  2. 安裝圖形庫: 如果必須使用 openjdk:8-jdk-alpine,則需在 Dockerfile 中安裝 xorg-x11-utils (或等效包) 等圖形庫,提供 AWT 運(yùn)行環(huán)境。 需仔細(xì)檢查 AWT 的依賴關(guān)系,確保安裝所有必要庫文件。

  3. 分析 hs_err_pid1.log: 該文件包含 jvm 崩潰的詳細(xì)信息,提供更準(zhǔn)確的錯(cuò)誤原因。

  4. 精簡或禁用圖形驗(yàn)證碼: 考慮使用無需 AWT 的圖形驗(yàn)證碼庫,或在生產(chǎn)環(huán)境中禁用圖形驗(yàn)證碼功能。 這是一種權(quán)宜之計(jì),需根據(jù)實(shí)際情況權(quán)衡。

解決問題的關(guān)鍵在于確保容器內(nèi)的 Java 環(huán)境擁有完整的 AWT 支持。

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