Import from MulkCMS 2.

Change-Id: I8b2f6d4833ee606b59264b368df7110039b722d7
diff --git a/openjdk-runtime/.gitignore b/openjdk-runtime/.gitignore
new file mode 100644
index 0000000..3ed2fbd
--- /dev/null
+++ b/openjdk-runtime/.gitignore
@@ -0,0 +1,6 @@
+# SPDX-FileCopyrightText: © 2022 Matthias Andreas Benkard <code@mail.matthias.benkard.de>
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+/cache
+/jdk-dist
diff --git a/openjdk-runtime/Dockerfile b/openjdk-runtime/Dockerfile
new file mode 100644
index 0000000..ad41771
--- /dev/null
+++ b/openjdk-runtime/Dockerfile
@@ -0,0 +1,30 @@
+# SPDX-FileCopyrightText: © 2022 Matthias Andreas Benkard <code@mail.matthias.benkard.de>
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+FROM registry.access.redhat.com/ubi8/ubi-minimal:latest AS ubi-minimal
+
+# Add OpenJDK (complete).
+ADD jdk-dist/latest.tar.gz /jdk
+
+# JLink a trimmed JDK.
+RUN microdnf --assumeyes --nodocs install binutils
+RUN /jdk/*/bin/jlink \
+    -J-XX:MaxRAMPercentage=75 \
+    --add-modules java.base,java.instrument,java.naming,java.rmi,java.scripting,java.security.jgss,java.security.sasl,java.sql,jdk.compiler,jdk.jconsole,jdk.unsupported \
+    --compress=1 \
+    --no-man-pages \
+    --strip-debug \
+    --output /java
+RUN /java/bin/java -Xshare:dump
+
+# Set mtimes to @0 for reproducibility.
+RUN microdnf --assumeyes --nodocs install findutils
+RUN find /java -exec touch --date=@0 '{}' ';'
+
+# Build the final image.
+FROM registry.access.redhat.com/ubi8/ubi-micro:latest
+COPY --from=ubi-minimal /lib64/libz.so.1 /lib64/
+COPY --from=ubi-minimal /java /java
+ENV JAVA_HOME=/java
+ENV PATH=/java/bin:$PATH
diff --git a/openjdk-runtime/README.adoc b/openjdk-runtime/README.adoc
new file mode 100644
index 0000000..8687266
--- /dev/null
+++ b/openjdk-runtime/README.adoc
@@ -0,0 +1,69 @@
+// SPDX-FileCopyrightText: © 2022 Matthias Andreas Benkard <code@mail.matthias.benkard.de>
+//
+// SPDX-License-Identifier: GFDL-1.3-or-later
+
+= openjdk-runtime
+Matthias Andreas Benkard
+// Meta
+:experimental:
+:data-uri:
+:sectnums:
+:toc:
+:stem:
+:keywords: mulk
+// Settings
+:icons: font
+:source-highlighter: rouge
+
+A container image that contains an OpenJDK runtime suitable for running
+modern web services.
+
+
+== Summary
+
+This container image ships the latest OpenJDK feature release from
+https://jdk.java.net[jdk.java.net] on top of a
+https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/building_running_and_managing_containers/assembly_types-of-container-images_building-running-and-managing-containers#con_understanding-the-ubi-micro-images_assembly_types-of-container-images[Red
+Hat UBI Micro] base.
+
+The module set was selected for
+https://gerrit.benkard.de/plugins/gitiles/mulkcms2/[MulkCMS 2], which
+is a typical Quarkus application.  It will very likely work for other
+typical Quarkus applications.
+
+
+== Building
+
+[source,shell]
+----
+./prepare
+docker build -t $IMAGE_NAME .
+----
+
+
+== Customization
+
+You may want to customize the module set included in the JDK.
+
+For example, specifying `ALL-MODULE-PATH` includes all modules
+included in the OpenJDK distribution:
+
+[source,dockerfile]
+----
+RUN /jdk/*/bin/jlink \
+    -J-XX:MaxRAMPercentage=75 \
+    --add-modules ALL-MODULE-PATH \ #<1>
+    --compress=1 \
+    --no-man-pages \
+    --strip-debug \
+    --output /java
+----
+<1> Include all JDK modules.
+
+
+== Usage
+
+[source,shell]
+----
+docker run $IMAGE_NAME java -version
+----
diff --git a/openjdk-runtime/build b/openjdk-runtime/build
new file mode 100755
index 0000000..01347d7
--- /dev/null
+++ b/openjdk-runtime/build
@@ -0,0 +1,36 @@
+#! /bin/sh
+# SPDX-FileCopyrightText: © 2022 Matthias Andreas Benkard <code@mail.matthias.benkard.de>
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+set -euo pipefail
+
+cd "$(dirname $(readlink -e "$0"))"
+
+image=docker.benkard.de/mulk/openjdk-runtime:latest
+use_kaniko=no
+
+./prepare
+
+if [[ "${use_kaniko}" == yes ]]; then
+    docker run \
+        --mount type=bind,src="$PWD",target=/workspace \
+        gcr.io/kaniko-project/warmer:latest \
+        --cache-dir=/workspace/cache \
+        --image=registry.access.redhat.com/ubi8/ubi-micro:latest \
+        --image=registry.access.redhat.com/ubi8/ubi-minimal:latest
+
+    docker run \
+        --mount type=bind,src="$PWD",target=/workspace \
+        --mount type=bind,src="$HOME/.docker",target=/root/.docker,ro=true \
+        gcr.io/kaniko-project/executor:latest \
+        --dockerfile Dockerfile \
+        --destination "${image}" \
+        --context dir:///workspace/ \
+        --cache=true \
+        --cache-ttl=16800h0m0s \
+        --reproducible=true
+else
+    docker build -t "${image}" .
+    docker push "${image}"
+fi
diff --git a/openjdk-runtime/prepare b/openjdk-runtime/prepare
new file mode 100755
index 0000000..f0fddba
--- /dev/null
+++ b/openjdk-runtime/prepare
@@ -0,0 +1,16 @@
+#! /bin/sh
+# SPDX-FileCopyrightText: © 2022 Matthias Andreas Benkard <code@mail.matthias.benkard.de>
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+set -euo pipefail
+
+cd "$(dirname $(readlink -e "$0"))"
+
+openjdk_package_info=$(curl "https://api.foojay.io/disco/v2.0/packages?package_type=jdk&latest=per_distro&directly_downloadable=true&release_status=ga&javafx_bundled=false&operating_system=linux&architecture=x64&archive_type=tar.gz&distro=oracle_open_jdk")
+
+openjdk_package_uri=$(jq -r '.result[0].links.pkg_download_redirect' <<<"${openjdk_package_info}")
+openjdk_package_filename=$(jq -r '.result[0].filename' <<<"${openjdk_package_info}")
+curl --fail --create-dirs -C - -o "jdk-dist/${openjdk_package_filename}" "${openjdk_package_uri}"
+
+ln -svf "${openjdk_package_filename}" "jdk-dist/latest.tar.gz"