3

I'm trying to Dockerize my (otherwise running nice) very small akka-http webapp. I'm using the buildfile indicated here. For convenience added:

FROM alpine:latest as packager

RUN apk --no-cache add openjdk11-jdk openjdk11-jmods

ENV JAVA_MINIMAL="/opt/java-minimal"

# build minimal JRE
RUN /usr/lib/jvm/java-11-openjdk/bin/jlink \
    --verbose \
    --add-modules \
        java.base,java.sql,java.naming,java.desktop,java.management,java.security.jgss,java.instrument \
    --compress 2 --strip-debug --no-header-files --no-man-pages \
    --release-info="add:IMPLEMENTOR=radistao:IMPLEMENTOR_VERSION=radistao_JRE" \
    --output "$JAVA_MINIMAL"

FROM alpine:latest

ENV JAVA_HOME=/opt/java-minimal
ENV PATH="$PATH:$JAVA_HOME/bin"

COPY --from=packager "$JAVA_HOME" "$JAVA_HOME"
COPY build/libs/application.jar app.jar

ENTRYPOINT ["java","-jar","/app.jar"]

However it fails to start with error below. Because I'm using a minimalistic setup for jre11 I think I might be missing some modules. But I'm not sure, and I don't know which java modules are mandatory for an akka-http scala-12 application. Hopefully somebody knows??

Exception in thread "main" java.lang.ExceptionInInitializerError
    at akka.dispatch.AbstractNodeQueue.<clinit>(AbstractNodeQueue.java:181)
    at akka.actor.LightArrayRevolverScheduler.<init>(LightArrayRevolverScheduler.scala:157)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source)
    at akka.actor.ReflectiveDynamicAccess.$anonfun$createInstanceFor$1(ReflectiveDynamicAccess.scala:33)
    at scala.util.Try$.apply(Try.scala:209)
    at akka.actor.ReflectiveDynamicAccess.createInstanceFor(ReflectiveDynamicAccess.scala:28)
    at akka.actor.ReflectiveDynamicAccess.$anonfun$createInstanceFor$5(ReflectiveDynamicAccess.scala:39)
    at scala.util.Success.flatMap(Try.scala:247)
    at akka.actor.ReflectiveDynamicAccess.createInstanceFor(ReflectiveDynamicAccess.scala:39)
    at akka.actor.ActorSystemImpl.createScheduler(ActorSystem.scala:925)
    at akka.actor.ActorSystemImpl.<init>(ActorSystem.scala:786)
    at akka.actor.ActorSystem$.apply(ActorSystem.scala:246)
    at akka.actor.ActorSystem$.apply(ActorSystem.scala:289)
    at akka.actor.ActorSystem$.apply(ActorSystem.scala:234)
    at akka.actor.ActorSystem$.apply(ActorSystem.scala:225)
    at nl.d8r.stretchsketch.WebServer$.main(Server.scala:37)
    at nl.d8r.stretchsketch.WebServer.main(Server.scala)
Caused by: java.lang.ExceptionInInitializerError
    at akka.util.Unsafe.<clinit>(Unsafe.java:42)
    at akka.dispatch.AbstractNodeQueue.<clinit>(AbstractNodeQueue.java:179)
    ... 19 more
Caused by: java.lang.NoClassDefFoundError: sun/misc/Unsafe
    at akka.util.Unsafe.<clinit>(Unsafe.java:22)
    ... 20 more
Caused by: java.lang.ClassNotFoundException: sun.misc.Unsafe
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
    at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
    ... 21 more
dr jerry
  • 9,768
  • 24
  • 79
  • 122

1 Answers1

2

You need to add a jvm argument to your ENTRYPOINT clause:

--add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED

and should look like the following:

ENTRYPOINT ["java", "--add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED", "-jar","/app.jar"]
senjin.hajrulahovic
  • 2,961
  • 2
  • 17
  • 32
  • Together with the comment above I got it fixed: `jdk.unsupported` also needs to be added to the `--add-modules`! Thanks! – dr jerry Sep 02 '19 at 19:07