我正尝试使用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
对于如何解决此问题,我将不胜感激,
答案 0 :(得分:2)
问题是您在基础映像中同时安装了两个版本的libc
-GNU libc
和musl 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内部版本是否运行良好(但请注意,它不是稳定发行版! )。