【问题标题】:Openjdk 11 on busybox crash on SIGSEGV in libc.soOpenjdk 11 onbusybox 在 libc.so 中的 SIGSEGV 上崩溃
【发布时间】:2019-04-16 18:11:50
【问题描述】:

我正在尝试使用 openjdk 11 创建基于 busybox 的 docker 映像,以获得最小的 java 映像

我使用 progrium/busybox 作为包含 glibc 的基本映像并安装了缺少的 zlib.so:opkg-install zlib-dev
然后我从https://jdk.java.net/11/下载了编译好的linux jdk。

然后当尝试运行java -version 时,它会输出版本但随后崩溃。 这是来自创建的日志:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f6d7013d5c0, pid=47, tid=62
#
# JRE version: OpenJDK Runtime Environment (11.0.2+9) (build 11.0.2+9)
# Java VM: OpenJDK 64-Bit Server VM (11.0.2+9, mixed mode, tiered, compressed oops, g1 gc, linux-amd64)
# Problematic frame:
# C  [libc.so.6+0x385c0]  __call_tls_dtors+0x10
#

完整日志here

对于如何解决此问题的任何建议或指导,我将不胜感激,谢谢

【问题讨论】:

    标签: java docker glibc busybox


    【解决方案1】:

    问题是您在基本映像中同时安装了两个版本的libc - GNU libcmusl libc

    $ docker run -it progrium/busybox
    / #
    / # /lib64/libc.so.6
    GNU C Library (Buildroot) stable release version 2.18, by Roland McGrath et al.
    <...>
    / # 
    / # /lib64/libc.so
    musl libc (x86_64)
    <...>
    

    opkg 提供的libc 包是musl libc,opkg 包中的所有二进制文件都是针对它构建的。这包括zlib,所以,musl libc 是 Java 二进制的传递依赖。

    但是,在您的情况下,Java 二进制文件本身是针对 GNU libc 构建的,因此您最终会同时加载两个 libc 版本:

    / # LD_DEBUG=libs /opt/jdk/jdk-11.0.2/bin/java
    <...>
    572: calling init: /lib64/libc.so
    <...>
    572: calling init: /lib/libc.so.6
    

    结果是pretty unpredictable,在你的情况下这是一个分段错误。

    如果你想从 OpenJDK 官方网站下载 JDK 构建,你必须使用 Alpine Linux OpenJDK 构建,因为 Alpine 也使用musl libc

    不幸的是,OpenJDK 11 不存在此版本,但您可以检查 Early Access OpenJDK 13 为 Alpine Linux 构建的版本运行良好(但请注意,它不是稳定版本!)。

    【讨论】:

    • 感谢您的解释,我目前更喜欢 JDK 11,因为它是 LTS。我试过busybox:glibc,它编译了glibc,但它缺少libz.so,还有frolvlad/alpine-glibc,它在单独的目录中包含glibc,但我无法改变java共享库的加载路径
    • 说实话,我还是用Java 8,它有Alpine版本的OpenJDK镜像,openjdk:8-jdk-alpine,所以我很惊讶没有真的没有简单的方法 以获得 OpenJDK 11 的精简映像。考虑到所有替代方案...如果稳定性真的很重要,我不会费心费力地节省一些兆字节,而是使用公共的基于 Debian 的映像。它很大,但无论如何它都会比定制的手工纤薄结构更稳定。
    猜你喜欢
    • 2011-06-25
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    相关资源
    最近更新 更多