Openjdk 11 при сбое busybox на SIGSEGV в libc.so - PullRequest
1 голос
/ 16 апреля 2019

Я пытаюсь создать образ докера на основе busybox с openjdk 11, для минимального образа 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
#

полный журнал здесь

Буду признателен за любые советы или указания, как решить эту проблему, спасибо

1 Ответ

2 голосов
/ 17 апреля 2019

Проблема в том, что в базовом образе одновременно установлены две версии 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)
<...>

Пакет libc, предоставляемый opkg, равен 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

Результат довольно непредсказуемый , и в вашем случае это ошибка сегментации.

Если выЕсли вы хотите загрузить сборку JDK с официального сайта OpenJDK, вы должны использовать сборку Alpine Linux OpenJDK, поскольку Alpine также использует musl libc.

К сожалению, эта сборка отсутствует для OpenJDK 11, но вы можете проверить, что Ранний доступ OpenJDK 13 сборка для Alpine Linux работает довольно хорошо (но обратите внимание, что не стабильная версия сборки!).

...