Как запускать приложения Java SpringBoot в Alpine с OpenSSL
проблема
- Запуск приложения Java в Alpine Linux прерывается при выполнении вызовов TLS
- Некоторые библиотеки, такие как Apache's
commons-crypto
использует родные библиотеки, такие какopenssl
для некоторых звонков
Любое из моих приложений SpringBoot работает в JDK 8, JDK 11 и JDK 12 на Alpine 3.8
Настройка Alpine и JDK
- Все настройки описаны по адресу https://github.com/AdoptOpenJDK/openjdk-jdk11/issues/8.
Вот Dockerfile, который я использую
FROM alpine:3.8
# ca certificates: to support HTTPS calls to other services
# hadolint ignore=DL3008
RUN apk update && \
apk add bash ca-certificates openssl --no-cache
RUN update-ca-certificates
ENV JAVA_HOME=/opt/jdk-custom/jre
ENV PATH="$PATH:$JAVA_HOME/bin"
Ошибка сегментации на вызовах OpenSSL
Ошибка сегментации выглядит следующим образом:
--------------- S U M M A R Y ------------
Command Line: -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:+UseStringDeduplication -XX:MaxRAMFraction=2 -XX:+HeapDumpOnOutOfMemoryError -XX:ErrorFile=/runtime/logs/error.log -XX:HeapDumpPath=/runtime/logs/error.heap.hprof -XX:+UnlockExperimentalVMOptions -Djdk.module.showModuleResolution=true -Djava.security.egd=file:/dev/./urandom /runtime/server.jar
Host: Intel(R) Core(TM) i7-7820HQ CPU @ 2.90GHz, 6 cores, 7G, Alpine Linux v3.8
Time: Sun Nov 18 15:28:22 2018 UTC elapsed time: 8 seconds (0d 0h 0m 8s)
--------------- T H R E A D ---------------
Current thread (0x000055e8239a7800): JavaThread "main" [_thread_in_native, id=43, stack(0x00007f524b58f000,0x00007f524b68fab0)]
Stack: [0x00007f524b58f000,0x00007f524b68fab0], sp=0x00007f524b68c6d8, free space=1013k
Native frames: (J=compiled Java code, A=aot compiled Java code, j=interpreted, Vv=VM code, C=native code)
C 0x0000000000000e16
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j org.apache.commons.crypto.cipher.OpenSslNative.initIDs()V+0
j org.apache.commons.crypto.cipher.OpenSsl.<clinit>()V+8
v ~StubRoutines::call_stub
j org.apache.commons.crypto.cipher.OpenSslCipher.<init>(Ljava/util/Properties;Ljava/lang/String;)V+14
v ~StubRoutines::call_stub
org.springframework.boot.SpringApplication.applyInitializers(Lorg/springframework/context/ConfigurableApplicationContext;)V+50
j org.springframework.boot.SpringApplication.prepareContext(Lorg/springframework/context/ConfigurableApplicationContext;Lorg/springframework/core/env/ConfigurableEnvironment;Lorg/springframework/boot/SpringApplicationRunListeners;Lorg/springframework/boot/ApplicationArguments;Lorg/springframework/boot/Banner;)V+14
j org.springframework.boot.SpringApplication.run([Ljava/lang/String;)Lorg/springframework/context/ConfigurableApplicationContext;+86
j org.springframework.boot.SpringApplication.run([Ljava/lang/Object;[Ljava/lang/String;)Lorg/springframework/context/ConfigurableApplicationContext;+9
j org.springframework.boot.SpringApplication.run(Ljava/lang/Object;[Ljava/lang/String;)Lorg/springframework/context/ConfigurableApplicationContext;+9
v ~StubRoutines::call_stub
j jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Ljava/lang/reflect/Method;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+0 java.base@11-ea
j jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+100 java.base@11-ea
j jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+6 java.base@11-ea
j java.lang.reflect.Method.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+59 java.base@11-ea
j org.springframework.boot.loader.MainMethodRunner.run()V+43
j org.springframework.boot.loader.Launcher.launch([Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)V+14
j org.springframework.boot.loader.Launcher.launch([Ljava/lang/String;)V+19
j org.springframework.boot.loader.WarLauncher.main([Ljava/lang/String;)V+8
v ~StubRoutines::call_stub
1 ответ
Решение
- Пользователь на https://github.com/docker-library/haproxy/issues/60 отметил, что Alpine компилируется с
libressl
и НЕopenssl
, - Теперь я могу запустить любое приложение SpringBoot в Alpine Linux с предложенными зависимостями
libressl libressl-dev
- JDK 8, пользовательские JDK 11 и JDK 12 с Jlink
Вот обновленный Dockerfile
ОТ альпийского:3,8
# ca certificates: to support HTTPS calls to other services
# hadolint ignore=DL3008
RUN apk update && \
apk add bash ca-certificates libressl libressl-dev --no-cache
RUN update-ca-certificates
ENV JAVA_HOME=/opt/jdk-custom/jre
ENV PATH="$PATH:$JAVA_HOME/bin"