Installing openjdk 11 on alpine:3.9

I'm trying to build an alpine docker image with openjdk 11. To do so, I'm starting an alpine container:

docker run -it alpine:3.9 /bin/sh

And running the following:

export JAVA_HOME=/opt/openjdk-11
export PATH=$JAVA_HOME/bin:$PATH

export JAVA_VERSION=11.0.2
export JAVA_URL=https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz
export JAVA_SHA256=99be79935354f5c0df1ad293620ea36d13f48ec3ea870c838f20c504c9668b57

set -eux; \
    \
    wget -O /openjdk.tgz "$JAVA_URL"; \
    echo "$JAVA_SHA256 */openjdk.tgz" | sha256sum -c -; \
    mkdir -p "$JAVA_HOME"; \
    tar --extract --file /openjdk.tgz --directory "$JAVA_HOME" --strip-components 1; \
    rm /openjdk.tgz;

After that, I can confirm that a few things seem correct:

/ # ls -lah $JAVA_HOME/bin/java
+ ls -lah /opt/openjdk-11/bin/java
-rwxr-xr-x    1 668      668         8.5K Jan 18 05:20 /opt/openjdk-11/bin/java
/ # echo $PATH
+ echo /opt/openjdk-11/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
/opt/openjdk-11/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
/ # which java
+ which java
/opt/openjdk-11/bin/java

But when I run java itself, I get:

/ # java -version
+ java -version
/bin/sh: java: not found

And I get kicked out of the container. Am I missing something?


The reason you're getting java: not found is likely due to dynamic linking failure. You could verify this using ldd java.

Alpine Linux is using musl-libc for its libc (standard C library) implementation, in contrast to most other Linuxes which are using glibc, GNU's C library. As a consequence, standard Linux software that is built on non-Alpine distibutions, will usually be linked against glibc and cannot be ran on Alpine, without installing a glibc compatiblity layer. So you'll need an OpenJDK 11 Alpine build, specifically.

However, unfortunately, such build is not currently available. The OpenJDK 11 page states:

The Alpine Linux build previously available on this page was removed as of JDK 11 GA. It’s not production-ready because it hasn’t been tested thoroughly enough to be considered a GA build.

The alternatives are:

  • Installing proper glibc on the Alpine container. This is a fairly easy procedure, which will allow you to run any Linux software on Alpine. However, you won't be running "native Alpine" anymore. For installation procedure, so this post.

  • Installing non-official OpenJDK 11 Alpine from an OpenJDK vendor. Specifically, Zulu OpenJDK is a very good alternative, offering thoroughly tested and verified builds, which are free and open source as well.

Futher information is available in this StackOverflow post:
Why is the Java 11 base Docker image so large? (openjdk:11-jre-slim)

Update:

As of 2/6/19, the openjdk11 package is available in Alpine repositories! It could be grabbed from the edge/community repository with:

apk --no-cache add openjdk11 --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community