libc.so中SIGSEGV上busybox上的Openjdk 11崩溃

时间:2019-04-16 18:11:51

标签: java docker glibc busybox

我正尝试使用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

对于如何解决此问题,我将不胜感激,

1 个答案:

答案 0 :(得分:2)

问题是您在基础映像中同时安装了两个版本的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不存在该内部版本,但是您可以检查Alpine Linux的Early Access OpenJDK 13内部版本是否运行良好(但请注意,它不是稳定发行版! )。