FROM debian:buster-slim RUN set -eux; \ apt-get update; \ apt-get install -y --no-install-recommends \ # utilities for keeping Debian and OpenJDK CA certificates in sync ca-certificates p11-kit \ ; \ rm -rf /var/lib/apt/lists/* # Default to UTF-8 file.encoding ENV LANG C.UTF-8 ENV JAVA_HOME /usr/java/openjdk-15 ENV PATH $JAVA_HOME/bin:$PATH # backwards compatibility shim RUN { echo '#/bin/sh'; echo 'echo "$JAVA_HOME"'; } > /usr/local/bin/docker-java-home && chmod +x /usr/local/bin/docker-java-home && [ "$JAVA_HOME" = "$(docker-java-home)" ] # https://jdk.java.net/ # > Java Development Kit builds, from Oracle ENV JAVA_VERSION 15-ea+24 RUN set -eux; \ \ savedAptMark="$(apt-mark showmanual)"; \ apt-get update; \ apt-get install -y --no-install-recommends \ wget \ ; \ rm -rf /var/lib/apt/lists/*; \ \ arch="$(dpkg --print-architecture)"; \ # this "case" statement is generated via "update.sh" case "$arch" in \ # arm64v8 arm64 | aarch64) \ downloadUrl=https://download.java.net/java/early_access/jdk15/24/GPL/openjdk-15-ea+24_linux-aarch64_bin.tar.gz; \ downloadSha256=912b1ecb8b9329a67c577d1fa3a0391d48d60e3643c95f923f375b03c7ae51d9; \ ;; \ # amd64 amd64 | i386:x86-64) \ downloadUrl=https://download.java.net/java/early_access/jdk15/24/GPL/openjdk-15-ea+24_linux-x64_bin.tar.gz; \ downloadSha256=b1557a00210626792629afdd5a00e01c8939bb701b13475549063c82619e9a26; \ ;; \ # fallback *) echo >&2 "error: unsupported architecture: '$arch'"; exit 1 ;; \ esac; \ \ wget -O openjdk.tgz "$downloadUrl"; \ echo "$downloadSha256 */openjdk.tgz" | sha256sum -c -; \ \ mkdir -p "$JAVA_HOME"; \ tar --extract \ --file openjdk.tgz \ --directory "$JAVA_HOME" \ --strip-components 1 \ --no-same-owner \ ; \ rm openjdk.tgz; \ \ apt-mark auto '.*' > /dev/null; \ [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; \ apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ \ # update "cacerts" bundle to use Debian's CA certificates (and make sure it stays up-to-date with changes to Debian's store) # see https://github.com/docker-library/openjdk/issues/327 # http://rabexc.org/posts/certificates-not-working-java#comment-4099504075 # https://salsa.debian.org/java-team/ca-certificates-java/blob/3e51a84e9104823319abeb31f880580e46f45a98/debian/jks-keystore.hook.in # https://git.alpinelinux.org/aports/tree/community/java-cacerts/APKBUILD?id=761af65f38b4570093461e6546dcf6b179d2b624#n29 { \ echo '#!/usr/bin/env bash'; \ echo 'set -Eeuo pipefail'; \ echo 'if ! [ -d "$JAVA_HOME" ]; then echo >&2 "error: missing JAVA_HOME environment variable"; exit 1; fi'; \ # 8-jdk uses "$JAVA_HOME/jre/lib/security/cacerts" and 8-jre and 11+ uses "$JAVA_HOME/lib/security/cacerts" directly (no "jre" directory) echo 'cacertsFile=; for f in "$JAVA_HOME/lib/security/cacerts" "$JAVA_HOME/jre/lib/security/cacerts"; do if [ -e "$f" ]; then cacertsFile="$f"; break; fi; done'; \ echo 'if [ -z "$cacertsFile" ] || ! [ -f "$cacertsFile" ]; then echo >&2 "error: failed to find cacerts file in $JAVA_HOME"; exit 1; fi'; \ echo 'trust extract --overwrite --format=java-cacerts --filter=ca-anchors --purpose=server-auth "$cacertsFile"'; \ } > /etc/ca-certificates/update.d/docker-openjdk; \ chmod +x /etc/ca-certificates/update.d/docker-openjdk; \ /etc/ca-certificates/update.d/docker-openjdk; \ \ # https://github.com/docker-library/openjdk/issues/331#issuecomment-498834472 find "$JAVA_HOME/lib" -name '*.so' -exec dirname '{}' ';' | sort -u > /etc/ld.so.conf.d/docker-openjdk.conf; \ ldconfig; \ \ # https://github.com/docker-library/openjdk/issues/212#issuecomment-420979840 # https://openjdk.java.net/jeps/341 java -Xshare:dump; \ \ # basic smoke test javac --version; \ java --version # "jshell" is an interactive REPL for Java (see https://en.wikipedia.org/wiki/JShell) CMD ["jshell"]