|
| 1 | +FROM buildpack-deps:buster-scm |
| 2 | + |
| 3 | +RUN set -eux; \ |
| 4 | + apt-get update; \ |
| 5 | + apt-get install -y --no-install-recommends \ |
| 6 | + bzip2 \ |
| 7 | + unzip \ |
| 8 | + xz-utils \ |
| 9 | + \ |
| 10 | +# utilities for keeping Debian and OpenJDK CA certificates in sync |
| 11 | + ca-certificates p11-kit \ |
| 12 | + \ |
| 13 | +# jlink --strip-debug on 13+ needs objcopy: https://github.com/docker-library/openjdk/issues/351 |
| 14 | +# Error: java.io.IOException: Cannot run program "objcopy": error=2, No such file or directory |
| 15 | + binutils \ |
| 16 | +# java.lang.UnsatisfiedLinkError: /usr/local/openjdk-11/lib/libfontmanager.so: libfreetype.so.6: cannot open shared object file: No such file or directory |
| 17 | +# java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11FontManager |
| 18 | +# https://github.com/docker-library/openjdk/pull/235#issuecomment-424466077 |
| 19 | + fontconfig libfreetype6 \ |
| 20 | + ; \ |
| 21 | + rm -rf /var/lib/apt/lists/* |
| 22 | + |
| 23 | +# Default to UTF-8 file.encoding |
| 24 | +ENV LANG C.UTF-8 |
| 25 | + |
| 26 | +ENV JAVA_HOME /usr/java/openjdk-14 |
| 27 | +ENV PATH $JAVA_HOME/bin:$PATH |
| 28 | + |
| 29 | +# backwards compatibility shim |
| 30 | +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)" ] |
| 31 | + |
| 32 | +# https://jdk.java.net/ |
| 33 | +ENV JAVA_VERSION 14-ea+14 |
| 34 | +ENV JAVA_URL https://download.java.net/java/early_access/jdk14/14/GPL/openjdk-14-ea+14_linux-x64_bin.tar.gz |
| 35 | +ENV JAVA_SHA256 fc1aed4e0de423dbb27db449b63b25c61b06b80e275f7ef665cce6c61e736726 |
| 36 | + |
| 37 | +RUN set -eux; \ |
| 38 | + \ |
| 39 | + wget -O openjdk.tgz "$JAVA_URL"; \ |
| 40 | + echo "$JAVA_SHA256 */openjdk.tgz" | sha256sum -c -; \ |
| 41 | + \ |
| 42 | + mkdir -p "$JAVA_HOME"; \ |
| 43 | + tar --extract \ |
| 44 | + --file openjdk.tgz \ |
| 45 | + --directory "$JAVA_HOME" \ |
| 46 | + --strip-components 1 \ |
| 47 | + --no-same-owner \ |
| 48 | + ; \ |
| 49 | + rm openjdk.tgz; \ |
| 50 | + \ |
| 51 | +# update "cacerts" bundle to use Debian's CA certificates (and make sure it stays up-to-date with changes to Debian's store) |
| 52 | +# see https://github.com/docker-library/openjdk/issues/327 |
| 53 | +# http://rabexc.org/posts/certificates-not-working-java#comment-4099504075 |
| 54 | +# https://salsa.debian.org/java-team/ca-certificates-java/blob/3e51a84e9104823319abeb31f880580e46f45a98/debian/jks-keystore.hook.in |
| 55 | +# https://git.alpinelinux.org/aports/tree/community/java-cacerts/APKBUILD?id=761af65f38b4570093461e6546dcf6b179d2b624#n29 |
| 56 | + { \ |
| 57 | + echo '#!/usr/bin/env bash'; \ |
| 58 | + echo 'set -Eeuo pipefail'; \ |
| 59 | + echo 'if ! [ -d "$JAVA_HOME" ]; then echo >&2 "error: missing JAVA_HOME environment variable"; exit 1; fi'; \ |
| 60 | +# 8-jdk uses "$JAVA_HOME/jre/lib/security/cacerts" and 8-jre and 11+ uses "$JAVA_HOME/lib/security/cacerts" directly (no "jre" directory) |
| 61 | + 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'; \ |
| 62 | + echo 'if [ -z "$cacertsFile" ] || ! [ -f "$cacertsFile" ]; then echo >&2 "error: failed to find cacerts file in $JAVA_HOME"; exit 1; fi'; \ |
| 63 | + echo 'trust extract --overwrite --format=java-cacerts --filter=ca-anchors --purpose=server-auth "$cacertsFile"'; \ |
| 64 | + } > /etc/ca-certificates/update.d/docker-openjdk; \ |
| 65 | + chmod +x /etc/ca-certificates/update.d/docker-openjdk; \ |
| 66 | + /etc/ca-certificates/update.d/docker-openjdk; \ |
| 67 | + \ |
| 68 | +# https://github.com/docker-library/openjdk/issues/331#issuecomment-498834472 |
| 69 | + find "$JAVA_HOME/lib" -name '*.so' -exec dirname '{}' ';' | sort -u > /etc/ld.so.conf.d/docker-openjdk.conf; \ |
| 70 | + ldconfig; \ |
| 71 | + \ |
| 72 | +# https://github.com/docker-library/openjdk/issues/212#issuecomment-420979840 |
| 73 | +# https://openjdk.java.net/jeps/341 |
| 74 | + java -Xshare:dump; \ |
| 75 | + \ |
| 76 | +# basic smoke test |
| 77 | + javac --version; \ |
| 78 | + java --version |
| 79 | + |
| 80 | +# "jshell" is an interactive REPL for Java (see https://en.wikipedia.org/wiki/JShell) |
| 81 | +CMD ["jshell"] |
0 commit comments