official-images icon indicating copy to clipboard operation
official-images copied to clipboard

Add lts-and-current images to allow Gradle to use Java 22

Open keeganwitt opened this issue 10 months ago • 9 comments

As noted in the compatibility guide, Gradle supports compiling with Java 22 using toolchains, but doesn't yet support executing Gradle. This means Gradle must be launched with a supported version of Java (such as the last LTS release) and then use toolchains to configure compilation using a second JDK on the image. I've tried to document this here.

keeganwitt avatar Apr 06 '24 03:04 keeganwitt

Diff for d6f70c979234f414a6fa5b826726ff97f10c2b9d:
diff --git a/_bashbrew-cat b/_bashbrew-cat
index f241917..c28f3cf 100644
--- a/_bashbrew-cat
+++ b/_bashbrew-cat
@@ -95,58 +95,73 @@ Directory: jdk17-focal
 
 Tags: 8.7.0-jdk8, 8.7-jdk8, 8-jdk8, jdk8, 8.7.0-jdk8-jammy, 8.7-jdk8-jammy, 8-jdk8-jammy, jdk8-jammy
 Architectures: amd64, arm32v7, arm64v8, ppc64le
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 5ca02d087b9989b0d54bc4a62a797c86c1b77d38
 Directory: jdk8
 
 Tags: 8.7.0-jdk8-focal, 8.7-jdk8-focal, 8-jdk8-focal, jdk8-focal
 Architectures: amd64, arm32v7, arm64v8, ppc64le
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 5ca02d087b9989b0d54bc4a62a797c86c1b77d38
 Directory: jdk8-focal
 
 Tags: 8.7.0-jdk11, 8.7-jdk11, 8-jdk11, jdk11, 8.7.0-jdk11-jammy, 8.7-jdk11-jammy, 8-jdk11-jammy, jdk11-jammy
 Architectures: amd64, arm32v7, arm64v8, ppc64le, s390x
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 5ca02d087b9989b0d54bc4a62a797c86c1b77d38
 Directory: jdk11
 
 Tags: 8.7.0-jdk11-alpine, 8.7-jdk11-alpine, 8-jdk11-alpine, jdk11-alpine
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 5ca02d087b9989b0d54bc4a62a797c86c1b77d38
 Directory: jdk11-alpine
 
 Tags: 8.7.0-jdk11-focal, 8.7-jdk11-focal, 8-jdk11-focal, jdk11-focal
 Architectures: amd64, arm32v7, arm64v8, ppc64le, s390x
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 5ca02d087b9989b0d54bc4a62a797c86c1b77d38
 Directory: jdk11-focal
 
 Tags: 8.7.0-jdk17, 8.7-jdk17, 8-jdk17, jdk17, 8.7.0-jdk17-jammy, 8.7-jdk17-jammy, 8-jdk17-jammy, jdk17-jammy
 Architectures: amd64, arm32v7, arm64v8, ppc64le, s390x
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 5ca02d087b9989b0d54bc4a62a797c86c1b77d38
 Directory: jdk17
 
 Tags: 8.7.0-jdk17-alpine, 8.7-jdk17-alpine, 8-jdk17-alpine, jdk17-alpine, 8.7.0-jdk-alpine, 8.7-jdk-alpine, 8-jdk-alpine, jdk-alpine, 8.7.0-alpine, 8.7-alpine, 8-alpine, alpine
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 5ca02d087b9989b0d54bc4a62a797c86c1b77d38
 Directory: jdk17-alpine
 
 Tags: 8.7.0-jdk17-focal, 8.7-jdk17-focal, 8-jdk17-focal, jdk17-focal, 8.7.0-jdk-focal, 8.7-jdk-focal, 8-jdk-focal, jdk-focal, 8.7.0-focal, 8.7-focal, 8-focal, focal
 Architectures: amd64, arm32v7, arm64v8, ppc64le, s390x
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 5ca02d087b9989b0d54bc4a62a797c86c1b77d38
 Directory: jdk17-focal
 
 Tags: 8.7.0-jdk17-graal, 8.7-jdk17-graal, 8-jdk17-graal, jdk17-graal, 8.7.0-jdk-graal, 8.7-jdk-graal, 8-jdk-graal, jdk-graal, 8.7.0-graal, 8.7-graal, 8-graal, graal, 8.7.0-jdk17-graal-jammy, 8.7-jdk17-graal-jammy, 8-jdk17-graal-jammy, jdk17-graal-jammy, 8.7.0-jdk-graal-jammy, 8.7-jdk-graal-jammy, 8-jdk-graal-jammy, jdk-graal-jammy, 8.7.0-graal-jammy, 8.7-graal-jammy, 8-graal-jammy, graal-jammy
 Architectures: amd64, arm64v8
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 5ca02d087b9989b0d54bc4a62a797c86c1b77d38
 Directory: jdk17-graal
 
 Tags: 8.7.0-jdk21, 8.7-jdk21, 8-jdk21, jdk21, 8.7.0-jdk21-jammy, 8.7-jdk21-jammy, 8-jdk21-jammy, jdk21-jammy, latest, 8.7.0-jdk, 8.7-jdk, 8-jdk, jdk, 8.7.0, 8.7, 8, 8.7.0-jdk-jammy, 8.7-jdk-jammy, 8-jdk-jammy, jdk-jammy, 8.7.0-jammy, 8.7-jammy, 8-jammy, jammy
 Architectures: amd64, arm64v8
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 5ca02d087b9989b0d54bc4a62a797c86c1b77d38
 Directory: jdk21
 
 Tags: 8.7.0-jdk21-alpine, 8.7-jdk21-alpine, 8-jdk21-alpine, jdk21-alpine
 Architectures: amd64, arm64v8
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 5ca02d087b9989b0d54bc4a62a797c86c1b77d38
 Directory: jdk21-alpine
 
 Tags: 8.7.0-jdk21-graal, 8.7-jdk21-graal, 8-jdk21-graal, jdk21-graal, 8.7.0-jdk21-graal-jammy, 8.7-jdk21-graal-jammy, 8-jdk21-graal-jammy, jdk21-graal-jammy
 Architectures: amd64, arm64v8
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 5ca02d087b9989b0d54bc4a62a797c86c1b77d38
 Directory: jdk21-graal
+
+Tags: 8.7.0-jdk-lts-and-current, 8.7-jdk-lts-and-current, 8-jdk-lts-and-current, jdk-lts-and-current, 8.7.0-jdk-lts-and-current-jammy, 8.7-jdk-lts-and-current-jammy, 8-jdk-lts-and-current-jammy, jdk-lts-and-current-jammy, 8.7.0-jdk-21-and-22, 8.7-jdk-21-and-22, 8-jdk-21-and-22, jdk-21-and-22, 8.7.0-jdk-21-and-22-jammy, 8.7-jdk-21-and-22-jammy, 8-jdk-21-and-22-jammy, jdk-21-and-22-jammy
+Architectures: amd64, arm64v8
+GitCommit: 5ca02d087b9989b0d54bc4a62a797c86c1b77d38
+Directory: jdk-lts-and-current
+
+Tags: 8.7.0-jdk-lts-and-current-alpine, 8.7-jdk-lts-and-current-alpine, 8-jdk-lts-and-current-alpine, jdk-lts-and-current-alpine, 8.7.0-jdk-21-and-22-alpine, 8.7-jdk-21-and-22-alpine, 8-jdk-21-and-22-alpine, jdk-21-and-22-alpine
+Architectures: amd64, arm64v8
+GitCommit: 5ca02d087b9989b0d54bc4a62a797c86c1b77d38
+Directory: jdk-lts-and-current-alpine
+
+Tags: 8.7.0-jdk-lts-and-current-graal, 8.7-jdk-lts-and-current-graal, 8-jdk-lts-and-current-graal, jdk-lts-and-current-graal, 8.7.0-jdk-lts-and-current-graal-jammy, 8.7-jdk-lts-and-current-graal-jammy, 8-jdk-lts-and-current-graal-jammy, jdk-lts-and-current-graal-jammy, 8.7.0-jdk-21-and-22-graal, 8.7-jdk-21-and-22-graal, 8-jdk-21-and-22-graal, jdk-21-and-22-graal, 8.7.0-jdk-21-and-22-graal-jammy, 8.7-jdk-21-and-22-graal-jammy, 8-jdk-21-and-22-graal-jammy, jdk-21-and-22-graal-jammy
+Architectures: amd64, arm64v8
+GitCommit: 5ca02d087b9989b0d54bc4a62a797c86c1b77d38
+Directory: jdk-lts-and-current-graal
diff --git a/_bashbrew-list b/_bashbrew-list
index 5179e5e..34a11cc 100644
--- a/_bashbrew-list
+++ b/_bashbrew-list
@@ -137,11 +137,21 @@ gradle:8-jdk21-alpine
 gradle:8-jdk21-graal
 gradle:8-jdk21-graal-jammy
 gradle:8-jdk21-jammy
+gradle:8-jdk-21-and-22
+gradle:8-jdk-21-and-22-alpine
+gradle:8-jdk-21-and-22-graal
+gradle:8-jdk-21-and-22-graal-jammy
+gradle:8-jdk-21-and-22-jammy
 gradle:8-jdk-alpine
 gradle:8-jdk-focal
 gradle:8-jdk-graal
 gradle:8-jdk-graal-jammy
 gradle:8-jdk-jammy
+gradle:8-jdk-lts-and-current
+gradle:8-jdk-lts-and-current-alpine
+gradle:8-jdk-lts-and-current-graal
+gradle:8-jdk-lts-and-current-graal-jammy
+gradle:8-jdk-lts-and-current-jammy
 gradle:8.7
 gradle:8.7-alpine
 gradle:8.7-focal
@@ -167,11 +177,21 @@ gradle:8.7-jdk21-alpine
 gradle:8.7-jdk21-graal
 gradle:8.7-jdk21-graal-jammy
 gradle:8.7-jdk21-jammy
+gradle:8.7-jdk-21-and-22
+gradle:8.7-jdk-21-and-22-alpine
+gradle:8.7-jdk-21-and-22-graal
+gradle:8.7-jdk-21-and-22-graal-jammy
+gradle:8.7-jdk-21-and-22-jammy
 gradle:8.7-jdk-alpine
 gradle:8.7-jdk-focal
 gradle:8.7-jdk-graal
 gradle:8.7-jdk-graal-jammy
 gradle:8.7-jdk-jammy
+gradle:8.7-jdk-lts-and-current
+gradle:8.7-jdk-lts-and-current-alpine
+gradle:8.7-jdk-lts-and-current-graal
+gradle:8.7-jdk-lts-and-current-graal-jammy
+gradle:8.7-jdk-lts-and-current-jammy
 gradle:8.7.0
 gradle:8.7.0-alpine
 gradle:8.7.0-focal
@@ -197,11 +217,21 @@ gradle:8.7.0-jdk21-alpine
 gradle:8.7.0-jdk21-graal
 gradle:8.7.0-jdk21-graal-jammy
 gradle:8.7.0-jdk21-jammy
+gradle:8.7.0-jdk-21-and-22
+gradle:8.7.0-jdk-21-and-22-alpine
+gradle:8.7.0-jdk-21-and-22-graal
+gradle:8.7.0-jdk-21-and-22-graal-jammy
+gradle:8.7.0-jdk-21-and-22-jammy
 gradle:8.7.0-jdk-alpine
 gradle:8.7.0-jdk-focal
 gradle:8.7.0-jdk-graal
 gradle:8.7.0-jdk-graal-jammy
 gradle:8.7.0-jdk-jammy
+gradle:8.7.0-jdk-lts-and-current
+gradle:8.7.0-jdk-lts-and-current-alpine
+gradle:8.7.0-jdk-lts-and-current-graal
+gradle:8.7.0-jdk-lts-and-current-graal-jammy
+gradle:8.7.0-jdk-lts-and-current-jammy
 gradle:alpine
 gradle:focal
 gradle:graal
@@ -226,9 +256,19 @@ gradle:jdk21-alpine
 gradle:jdk21-graal
 gradle:jdk21-graal-jammy
 gradle:jdk21-jammy
+gradle:jdk-21-and-22
+gradle:jdk-21-and-22-alpine
+gradle:jdk-21-and-22-graal
+gradle:jdk-21-and-22-graal-jammy
+gradle:jdk-21-and-22-jammy
 gradle:jdk-alpine
 gradle:jdk-focal
 gradle:jdk-graal
 gradle:jdk-graal-jammy
 gradle:jdk-jammy
+gradle:jdk-lts-and-current
+gradle:jdk-lts-and-current-alpine
+gradle:jdk-lts-and-current-graal
+gradle:jdk-lts-and-current-graal-jammy
+gradle:jdk-lts-and-current-jammy
 gradle:latest
diff --git a/gradle_jdk21-alpine/Dockerfile b/gradle_jdk-21-and-22-alpine/Dockerfile
similarity index 70%
copy from gradle_jdk21-alpine/Dockerfile
copy to gradle_jdk-21-and-22-alpine/Dockerfile
index b2714e5..f4bcb66 100644
--- a/gradle_jdk21-alpine/Dockerfile
+++ b/gradle_jdk-21-and-22-alpine/Dockerfile
@@ -1,5 +1,11 @@
+FROM eclipse-temurin:22-jdk-alpine AS java_current
+
 FROM eclipse-temurin:21-jdk-alpine
 
+COPY --from=java_current /opt/java/openjdk /opt/java/openjdk22
+ENV JAVA_LTS_HOME /opt/java/openjdk21
+ENV JAVA_CURRENT_HOME /opt/java/openjdk22
+
 CMD ["gradle"]
 
 ENV GRADLE_HOME /opt/gradle
@@ -10,10 +16,14 @@ RUN set -o errexit -o nounset \
     && adduser --system --ingroup gradle --uid 1000 --shell /bin/ash gradle \
     && mkdir /home/gradle/.gradle \
     && chown -R gradle:gradle /home/gradle \
-    && chmod -R o+rwx /home/gradle \
     \
     && echo "Symlinking root Gradle cache to gradle Gradle cache" \
-    && ln -s /home/gradle/.gradle /root/.gradle
+    && ln -s /home/gradle/.gradle /root/.gradle \
+   \
+   && echo "Ensuring Gradle detects installed JDKs" \
+   && echo "org.gradle.java.installations.auto-detect=false" > /home/gradle/.gradle/gradle.properties \
+   && echo "org.gradle.java.installations.auto-download=false" >> /home/gradle/.gradle/gradle.properties \
+   && echo "org.gradle.java.installations.fromEnv=JAVA_LTS_HOME,JAVA_CURRENT_HOME" >> /home/gradle/.gradle/gradle.properties
 
 VOLUME /home/gradle/.gradle
 
diff --git a/gradle_jdk21-graal-jammy/Dockerfile b/gradle_jdk-21-and-22-graal-jammy/Dockerfile
similarity index 56%
copy from gradle_jdk21-graal-jammy/Dockerfile
copy to gradle_jdk-21-and-22-graal-jammy/Dockerfile
index f69de99..8bea2ca 100644
--- a/gradle_jdk21-graal-jammy/Dockerfile
+++ b/gradle_jdk-21-and-22-graal-jammy/Dockerfile
@@ -9,11 +9,14 @@ RUN set -o errexit -o nounset \
     && groupadd --system --gid 1000 gradle \
     && useradd --system --gid gradle --uid 1000 --shell /bin/bash --create-home gradle \
     && mkdir /home/gradle/.gradle \
-    && chown --recursive gradle:gradle /home/gradle \
-    && chmod -R o+rwx /home/gradle \
     \
     && echo "Symlinking root Gradle cache to gradle Gradle cache" \
-    && ln --symbolic /home/gradle/.gradle /root/.gradle
+    && ln --symbolic /home/gradle/.gradle /root/.gradle \
+   \
+   && echo "Ensuring Gradle detects installed JDKs" \
+   && echo "org.gradle.java.installations.auto-detect=false" > /home/gradle/.gradle/gradle.properties \
+   && echo "org.gradle.java.installations.auto-download=false" >> /home/gradle/.gradle/gradle.properties \
+   && echo "org.gradle.java.installations.fromEnv=JAVA_LTS_HOME,JAVA_CURRENT_HOME" >> /home/gradle/.gradle/gradle.properties
 
 VOLUME /home/gradle/.gradle
 
@@ -54,29 +57,54 @@ RUN set -o errexit -o nounset \
     && which svn
 
 ENV JAVA_HOME=/opt/java/graalvm
-ENV JAVA_VERSION=21.0.2
+ENV JAVA_LTS_HOME /opt/java/graalvm21
+ENV JAVA_CURRENT_HOME /opt/java/graalvm22
 RUN set -o errexit -o nounset \
     && mkdir /opt/java \
     \
-    && echo "Downloading GraalVM" \
+    && echo "Downloading LTS GraalVM" \
+    && JDK_VERSION=21.0.2 \
     && GRAALVM_AMD64_DOWNLOAD_SHA256=b048069aaa3a99b84f5b957b162cc181a32a4330cbc35402766363c5be76ae48 \
     && GRAALVM_AARCH64_DOWNLOAD_SHA256=a34be691ce68f0acf4655c7c6c63a9a49ed276a11859d7224fd94fc2f657cd7a \
     && ARCHITECTURE=$(dpkg --print-architecture) \
     && if [ "${ARCHITECTURE}" = "amd64" ]; then GRAALVM_ARCHITECTURE=linux-x64; fi \
     && if [ "${ARCHITECTURE}" = "arm64" ]; then GRAALVM_ARCHITECTURE=linux-aarch64; fi \
-    && GRAALVM_PKG=https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-${JAVA_VERSION}/graalvm-community-jdk-${JAVA_VERSION}_${GRAALVM_ARCHITECTURE}_bin.tar.gz \
+    && GRAALVM_PKG=https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-${JDK_VERSION}/graalvm-community-jdk-${JDK_VERSION}_${GRAALVM_ARCHITECTURE}_bin.tar.gz \
+    && wget --no-verbose --output-document=graalvm.tar.gz "${GRAALVM_PKG}" \
+    \
+    && echo "Checking LTS GraalVM download hash" \
+    && if [ "${ARCHITECTURE}" = "amd64" ]; then GRAALVM_DOWNLOAD_SHA256="${GRAALVM_AMD64_DOWNLOAD_SHA256}"; fi \
+    && if [ "${ARCHITECTURE}" = "arm64" ]; then GRAALVM_DOWNLOAD_SHA256="${GRAALVM_AARCH64_DOWNLOAD_SHA256}"; fi \
+    && echo "${GRAALVM_DOWNLOAD_SHA256} *graalvm.tar.gz" | sha256sum --check - \
+    \
+    && echo "Installing LTS GraalVM" \
+    && tar --extract --gunzip --file graalvm.tar.gz \
+    && rm graalvm.tar.gz \
+    && mv graalvm-* /opt/java/graalvm21 \
+    \
+    && echo "Downloading current GraalVM" \
+    && JDK_VERSION=22.0.0 \
+    && GRAALVM_AMD64_DOWNLOAD_SHA256=e5eeb486a23101753f18181d002c3ede9da13c463fb61d3ea448abe774db0657 \
+    && GRAALVM_AARCH64_DOWNLOAD_SHA256=da9a0e11b110ebccff33ade502516d00f574ec3247868007e452cef4143e0904 \
+    && ARCHITECTURE=$(dpkg --print-architecture) \
+    && if [ "${ARCHITECTURE}" = "amd64" ]; then GRAALVM_ARCHITECTURE=linux-x64; fi \
+    && if [ "${ARCHITECTURE}" = "arm64" ]; then GRAALVM_ARCHITECTURE=linux-aarch64; fi \
+    && GRAALVM_PKG=https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-${JDK_VERSION}/graalvm-community-jdk-${JDK_VERSION}_${GRAALVM_ARCHITECTURE}_bin.tar.gz \
     && wget --no-verbose --output-document=graalvm.tar.gz "${GRAALVM_PKG}" \
     \
-    && echo "Checking GraalVM download hash" \
+    && echo "Checking current GraalVM download hash" \
     && if [ "${ARCHITECTURE}" = "amd64" ]; then GRAALVM_DOWNLOAD_SHA256="${GRAALVM_AMD64_DOWNLOAD_SHA256}"; fi \
     && if [ "${ARCHITECTURE}" = "arm64" ]; then GRAALVM_DOWNLOAD_SHA256="${GRAALVM_AARCH64_DOWNLOAD_SHA256}"; fi \
     && echo "${GRAALVM_DOWNLOAD_SHA256} *graalvm.tar.gz" | sha256sum --check - \
     \
-    && echo "Installing GraalVM" \
+    && echo "Installing current GraalVM" \
     && tar --extract --gunzip --file graalvm.tar.gz \
     && rm graalvm.tar.gz \
-    && mv graalvm-* "${JAVA_HOME}" \
-    && for bin in "$JAVA_HOME/bin/"*; do \
+    && mv graalvm-* /opt/java/graalvm22 \
+    \
+    && echo "Default Java to LTS GraalVM" \
+    && ln --symbolic /opt/java/graalvm21 /opt/java/graalvm \
+    && for bin in /opt/java/graalvm21/bin/*; do \
         base="$(basename "$bin")"; \
         [ ! -e "/usr/bin/$base" ]; \
         update-alternatives --install "/usr/bin/${base}" "${base}" "${bin}" 1; \
@@ -100,12 +128,10 @@ RUN set -o errexit -o nounset \
     && unzip gradle.zip \
     && rm gradle.zip \
     && mv "gradle-${GRADLE_VERSION}" "${GRADLE_HOME}/" \
-    && ln --symbolic "${GRADLE_HOME}/bin/gradle" /usr/bin/gradle
-
-USER gradle
-
-RUN set -o errexit -o nounset \
+    && ln --symbolic "${GRADLE_HOME}/bin/gradle" /usr/bin/gradle \
+    \
     && echo "Testing Gradle installation" \
-    && gradle --version
-
-USER root
+    && gradle --version \
+    \
+    # chown last so that it applies to /home/gradle/.gradle/native
+    && chown --recursive gradle:gradle /home/gradle
diff --git a/gradle_jammy/Dockerfile b/gradle_jdk-21-and-22-jammy/Dockerfile
similarity index 70%
copy from gradle_jammy/Dockerfile
copy to gradle_jdk-21-and-22-jammy/Dockerfile
index 8efa101..e5202b9 100644
--- a/gradle_jammy/Dockerfile
+++ b/gradle_jdk-21-and-22-jammy/Dockerfile
@@ -1,5 +1,11 @@
+FROM eclipse-temurin:22-jdk-jammy AS java_current
+
 FROM eclipse-temurin:21-jdk-jammy
 
+COPY --from=java_current /opt/java/openjdk /opt/java/openjdk22
+ENV JAVA_LTS_HOME /opt/java/openjdk21
+ENV JAVA_CURRENT_HOME /opt/java/openjdk22
+
 CMD ["gradle"]
 
 ENV GRADLE_HOME /opt/gradle
@@ -10,10 +16,14 @@ RUN set -o errexit -o nounset \
     && useradd --system --gid gradle --uid 1000 --shell /bin/bash --create-home gradle \
     && mkdir /home/gradle/.gradle \
     && chown --recursive gradle:gradle /home/gradle \
-    && chmod --recursive o+rwx /home/gradle \
     \
     && echo "Symlinking root Gradle cache to gradle Gradle cache" \
-    && ln --symbolic /home/gradle/.gradle /root/.gradle
+    && ln --symbolic /home/gradle/.gradle /root/.gradle \
+    \
+    && echo "Ensuring Gradle detects installed JDKs" \
+    && echo "org.gradle.java.installations.auto-detect=false" > /home/gradle/.gradle/gradle.properties \
+    && echo "org.gradle.java.installations.auto-download=false" >> /home/gradle/.gradle/gradle.properties \
+    && echo "org.gradle.java.installations.fromEnv=JAVA_LTS_HOME,JAVA_CURRENT_HOME" >> /home/gradle/.gradle/gradle.properties
 
 VOLUME /home/gradle/.gradle
 
@@ -46,19 +56,14 @@ RUN set -o errexit -o nounset \
     && echo "Downloading Gradle" \
     && wget --no-verbose --output-document=gradle.zip "https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip" \
     \
-    && echo "Checking Gradle download hash" \
+    && echo "Checking download hash" \
     && echo "${GRADLE_DOWNLOAD_SHA256} *gradle.zip" | sha256sum --check - \
     \
     && echo "Installing Gradle" \
     && unzip gradle.zip \
     && rm gradle.zip \
     && mv "gradle-${GRADLE_VERSION}" "${GRADLE_HOME}/" \
-    && ln --symbolic "${GRADLE_HOME}/bin/gradle" /usr/bin/gradle
-
-USER gradle
-
-RUN set -o errexit -o nounset \
+    && ln --symbolic "${GRADLE_HOME}/bin/gradle" /usr/bin/gradle \
+    \
     && echo "Testing Gradle installation" \
     && gradle --version
-
-USER root

Relevant Maintainers:

  • gradle: @keeganwitt

github-actions[bot] avatar Apr 06 '24 03:04 github-actions[bot]

I'm concerned about adding a new "lts-and-current" variant/alias and the support burden that will be for you over time for what's hopefully a temporary problem. :sweat_smile: :grimacing:

I think I'm understanding this correctly, but just to confirm, the problem this is solving is that users want to use Gradle to compile their applications against JDK 22, but Gradle itself will not run on 22, correct?

If my understanding of the problem is correct, wouldn't it be simpler to have the jdk22 images just quietly embed 21 (JRE-only, even?) for now, so Gradle itself can be run on 21 but 22 can be used for compiling?

(Apologies if I've misunderstood or have oversimplified the complexity here :smile: :heart:)

tianon avatar Apr 08 '24 17:04 tianon

I'm concerned about adding a new "lts-and-current" variant/alias and the support burden that will be for you over time for what's hopefully a temporary problem. 😅 😬

It's a recurring "temporary" problem. We had users asking for Java 20, 21 (which was LTS), and now 22 support. Gradle always lags in supporting the newest Java, often by months. And for non-LTS releases, they're only supported 6 months, so that means the window of time in which you have to test new Java versions with Gradle might be only a few months before it's no longer supported. I share the concern about adding more maintenance burden (I waited when the Java 21 question came up and it took far longer than I expected for support to land in Gradle).

I think I'm understanding this correctly, but just to confirm, the problem this is solving is that users want to use Gradle to compile their applications against JDK 22, but Gradle itself will not run on 22, correct?

Yep, exactly.

If my understanding of the problem is correct, wouldn't it be simpler to have the jdk22 images just quietly embed 21 (JRE-only, even?) for now, so Gradle itself can be run on 21 but 22 can be used for compiling

That would be another valid solution for this. The reason I chose a new name was I wanted to make it clear this is different from any regular image, because I set global Gradle properties to make it easier to use toolchains for this use case, which I don't do for the other images. So whenever Gradle finally supports 22 fully (assuming they do so before September when 22 is EOL), I would release a normally named jdk22 tag which would only contain Java 22 and won't contain the global Gradle properties.

I suppose we could have the jdk22 image temporarily set the properties and have the other JDK installed, but I thought it was confusing and potentially breaking to fundamentally alter how an image operates.

I definitely welcome more thoughts on this. It's kinda a messy problem.

keeganwitt avatar Apr 08 '24 20:04 keeganwitt

Yeah, totally fair, that makes sense. I'm not sure what the best answer is -- there's not a cleaner way to convince Gradle itself to use an installation of JRE 21 (maybe in a non-standard path?) and not use/expose that for users without changing the global configuration like you've had to? :disappointed:

For the recurring case, is "current-and-lts" always a sufficient workaround? In other words, might there eventually be a case where the latest LTS and the latest "current" are both versions Gradle can't handle?

tianon avatar Apr 08 '24 21:04 tianon

there's not a cleaner way to convince Gradle itself to use an installation of JRE 21 (maybe in a non-standard path?) and not use/expose that for users without changing the global configuration like you've had to? 😞

If there is, I haven't found it yet. I'm fairly certain there isn't. The one place I'll double check is if the Gradle bin script has something in it I can use to customize which Java gets used.

For the recurring case, is "current-and-lts" always a sufficient workaround? In other words, might there eventually be a case where the latest LTS and the latest "current" are both versions Gradle can't handle?

This actually will probably happen with Java 25. It will be the next LTS and when it comes out, the latest Gradle will not be able to be launched with 25, but would be able to with Java 21 and 24, but 24 won't be supported at that point, so it'd have to be 21 still. This is a case where the latest current and latest LTS are the same release. Hopefully that made sense. When that happens I was thinking the image would be 21 and 25 (since it will be 21 and 22, 23, 24 before that). Once Gradle supports 25, then it could be just 25 (or maybe we leave it as 21 and 25 if that's less confusing). Either way, the next Java release after that will have Java 25 and 26 in this image.

keeganwitt avatar Apr 09 '24 06:04 keeganwitt

Gah yeah, that's a messy situation :sob:

Looking through https://github.com/gradle/gradle/blob/3ceb6ffc8c33313642b02fd9ff048c0f59ad4a10/gradlew I don't see anything particularly helpful for this case -- I wonder if they'd be open to something like ${GRADLE_JAVA_HOME:-$JAVA_HOME} or : ${GRADLE_JAVA_HOME:=$JAVA_HOME} and then replace all uses of JAVA_HOME :thinking:

tianon avatar Apr 09 '24 17:04 tianon

The file you referenced is actually part of the wrapper, which usually isn't used with this image (it downloads Gradle and launches it). The launcher script I believe is https://github.com/gradle/gradle/blob/6d38851488eff56a6ab4b5a38f9ece3b4d421a5f/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt. But I don't see anything we can manipulate there either, just JAVA_HOME.

keeganwitt avatar Apr 09 '24 19:04 keeganwitt

Yeah, it's got very similar logic. :disappointed:

tianon avatar Apr 09 '24 21:04 tianon

https://docs.gradle.org/current/userguide/build_environment.html says that org.gradle.java.home is just for configuring the path to the JDK used for building, and not the client VM. JAVA_HOME seems to be the only option to configure the client VM. But even if we had a GRADLE_JAVA_HOME, we'd still have to configure org.gradle.java.home globally, since by default Gradle will use the client JDK for the daemon also.

keeganwitt avatar Apr 10 '24 02:04 keeganwitt

I think the question of whether there's other ways to tell Gradle which JDK to use is a separate question from the maintenance burden of an lts-and-current image and the potential confusion it could cause. That seems kinda unavoidable given this support lag that Gradle has. Given that, should we consider moving forward with these images?

keeganwitt avatar May 20 '24 03:05 keeganwitt

Given that, should we consider moving forward with these images?

I would appreciate it if someone could review/release these images. Given that Java has a 6-month release cadence, if we wait much longer, v22 will no longer be the latest.

donalmurtagh avatar May 20 '24 09:05 donalmurtagh

In gradle:jdk-21-and-22-jammy and -alpine the Dockerfiles set JAVA_LTS_HOME, but that path is non-existent in the base images, and I don't see a symlink created. Was it supposed to just point to /opt/java/openjdk or $JAVA_HOME?

ENV JAVA_LTS_HOME /opt/java/openjdk21

yosifkit avatar May 20 '24 20:05 yosifkit

In gradle:jdk-21-and-22-jammy and -alpine the Dockerfiles set JAVA_LTS_HOME, but that path is non-existent in the base images, and I don't see a symlink created. Was it supposed to just point to /opt/java/openjdk or $JAVA_HOME?

Ah, good catch! /opt/java/openjdk and $JAVA_HOME should be one and the same. Fixed.

keeganwitt avatar May 20 '24 22:05 keeganwitt

Diff for a4c714bcec3798d21ba584aaf173a935c30fedf7:
diff --git a/_bashbrew-cat b/_bashbrew-cat
index f241917..73ca449 100644
--- a/_bashbrew-cat
+++ b/_bashbrew-cat
@@ -95,58 +95,73 @@ Directory: jdk17-focal
 
 Tags: 8.7.0-jdk8, 8.7-jdk8, 8-jdk8, jdk8, 8.7.0-jdk8-jammy, 8.7-jdk8-jammy, 8-jdk8-jammy, jdk8-jammy
 Architectures: amd64, arm32v7, arm64v8, ppc64le
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 9c247e401b860bb49937454ae84f6e77f1f3eab5
 Directory: jdk8
 
 Tags: 8.7.0-jdk8-focal, 8.7-jdk8-focal, 8-jdk8-focal, jdk8-focal
 Architectures: amd64, arm32v7, arm64v8, ppc64le
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 9c247e401b860bb49937454ae84f6e77f1f3eab5
 Directory: jdk8-focal
 
 Tags: 8.7.0-jdk11, 8.7-jdk11, 8-jdk11, jdk11, 8.7.0-jdk11-jammy, 8.7-jdk11-jammy, 8-jdk11-jammy, jdk11-jammy
 Architectures: amd64, arm32v7, arm64v8, ppc64le, s390x
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 9c247e401b860bb49937454ae84f6e77f1f3eab5
 Directory: jdk11
 
 Tags: 8.7.0-jdk11-alpine, 8.7-jdk11-alpine, 8-jdk11-alpine, jdk11-alpine
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 9c247e401b860bb49937454ae84f6e77f1f3eab5
 Directory: jdk11-alpine
 
 Tags: 8.7.0-jdk11-focal, 8.7-jdk11-focal, 8-jdk11-focal, jdk11-focal
 Architectures: amd64, arm32v7, arm64v8, ppc64le, s390x
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 9c247e401b860bb49937454ae84f6e77f1f3eab5
 Directory: jdk11-focal
 
 Tags: 8.7.0-jdk17, 8.7-jdk17, 8-jdk17, jdk17, 8.7.0-jdk17-jammy, 8.7-jdk17-jammy, 8-jdk17-jammy, jdk17-jammy
 Architectures: amd64, arm32v7, arm64v8, ppc64le, s390x
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 9c247e401b860bb49937454ae84f6e77f1f3eab5
 Directory: jdk17
 
 Tags: 8.7.0-jdk17-alpine, 8.7-jdk17-alpine, 8-jdk17-alpine, jdk17-alpine, 8.7.0-jdk-alpine, 8.7-jdk-alpine, 8-jdk-alpine, jdk-alpine, 8.7.0-alpine, 8.7-alpine, 8-alpine, alpine
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 9c247e401b860bb49937454ae84f6e77f1f3eab5
 Directory: jdk17-alpine
 
 Tags: 8.7.0-jdk17-focal, 8.7-jdk17-focal, 8-jdk17-focal, jdk17-focal, 8.7.0-jdk-focal, 8.7-jdk-focal, 8-jdk-focal, jdk-focal, 8.7.0-focal, 8.7-focal, 8-focal, focal
 Architectures: amd64, arm32v7, arm64v8, ppc64le, s390x
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 9c247e401b860bb49937454ae84f6e77f1f3eab5
 Directory: jdk17-focal
 
 Tags: 8.7.0-jdk17-graal, 8.7-jdk17-graal, 8-jdk17-graal, jdk17-graal, 8.7.0-jdk-graal, 8.7-jdk-graal, 8-jdk-graal, jdk-graal, 8.7.0-graal, 8.7-graal, 8-graal, graal, 8.7.0-jdk17-graal-jammy, 8.7-jdk17-graal-jammy, 8-jdk17-graal-jammy, jdk17-graal-jammy, 8.7.0-jdk-graal-jammy, 8.7-jdk-graal-jammy, 8-jdk-graal-jammy, jdk-graal-jammy, 8.7.0-graal-jammy, 8.7-graal-jammy, 8-graal-jammy, graal-jammy
 Architectures: amd64, arm64v8
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 9c247e401b860bb49937454ae84f6e77f1f3eab5
 Directory: jdk17-graal
 
 Tags: 8.7.0-jdk21, 8.7-jdk21, 8-jdk21, jdk21, 8.7.0-jdk21-jammy, 8.7-jdk21-jammy, 8-jdk21-jammy, jdk21-jammy, latest, 8.7.0-jdk, 8.7-jdk, 8-jdk, jdk, 8.7.0, 8.7, 8, 8.7.0-jdk-jammy, 8.7-jdk-jammy, 8-jdk-jammy, jdk-jammy, 8.7.0-jammy, 8.7-jammy, 8-jammy, jammy
 Architectures: amd64, arm64v8
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 9c247e401b860bb49937454ae84f6e77f1f3eab5
 Directory: jdk21
 
 Tags: 8.7.0-jdk21-alpine, 8.7-jdk21-alpine, 8-jdk21-alpine, jdk21-alpine
 Architectures: amd64, arm64v8
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 9c247e401b860bb49937454ae84f6e77f1f3eab5
 Directory: jdk21-alpine
 
 Tags: 8.7.0-jdk21-graal, 8.7-jdk21-graal, 8-jdk21-graal, jdk21-graal, 8.7.0-jdk21-graal-jammy, 8.7-jdk21-graal-jammy, 8-jdk21-graal-jammy, jdk21-graal-jammy
 Architectures: amd64, arm64v8
-GitCommit: 9a1868d61f289a711881d5af0299308968b0fc65
+GitCommit: 9c247e401b860bb49937454ae84f6e77f1f3eab5
 Directory: jdk21-graal
+
+Tags: 8.7.0-jdk-lts-and-current, 8.7-jdk-lts-and-current, 8-jdk-lts-and-current, jdk-lts-and-current, 8.7.0-jdk-lts-and-current-jammy, 8.7-jdk-lts-and-current-jammy, 8-jdk-lts-and-current-jammy, jdk-lts-and-current-jammy, 8.7.0-jdk-21-and-22, 8.7-jdk-21-and-22, 8-jdk-21-and-22, jdk-21-and-22, 8.7.0-jdk-21-and-22-jammy, 8.7-jdk-21-and-22-jammy, 8-jdk-21-and-22-jammy, jdk-21-and-22-jammy
+Architectures: amd64, arm64v8
+GitCommit: 9c247e401b860bb49937454ae84f6e77f1f3eab5
+Directory: jdk-lts-and-current
+
+Tags: 8.7.0-jdk-lts-and-current-alpine, 8.7-jdk-lts-and-current-alpine, 8-jdk-lts-and-current-alpine, jdk-lts-and-current-alpine, 8.7.0-jdk-21-and-22-alpine, 8.7-jdk-21-and-22-alpine, 8-jdk-21-and-22-alpine, jdk-21-and-22-alpine
+Architectures: amd64, arm64v8
+GitCommit: 9c247e401b860bb49937454ae84f6e77f1f3eab5
+Directory: jdk-lts-and-current-alpine
+
+Tags: 8.7.0-jdk-lts-and-current-graal, 8.7-jdk-lts-and-current-graal, 8-jdk-lts-and-current-graal, jdk-lts-and-current-graal, 8.7.0-jdk-lts-and-current-graal-jammy, 8.7-jdk-lts-and-current-graal-jammy, 8-jdk-lts-and-current-graal-jammy, jdk-lts-and-current-graal-jammy, 8.7.0-jdk-21-and-22-graal, 8.7-jdk-21-and-22-graal, 8-jdk-21-and-22-graal, jdk-21-and-22-graal, 8.7.0-jdk-21-and-22-graal-jammy, 8.7-jdk-21-and-22-graal-jammy, 8-jdk-21-and-22-graal-jammy, jdk-21-and-22-graal-jammy
+Architectures: amd64, arm64v8
+GitCommit: 9c247e401b860bb49937454ae84f6e77f1f3eab5
+Directory: jdk-lts-and-current-graal
diff --git a/_bashbrew-list b/_bashbrew-list
index 5179e5e..34a11cc 100644
--- a/_bashbrew-list
+++ b/_bashbrew-list
@@ -137,11 +137,21 @@ gradle:8-jdk21-alpine
 gradle:8-jdk21-graal
 gradle:8-jdk21-graal-jammy
 gradle:8-jdk21-jammy
+gradle:8-jdk-21-and-22
+gradle:8-jdk-21-and-22-alpine
+gradle:8-jdk-21-and-22-graal
+gradle:8-jdk-21-and-22-graal-jammy
+gradle:8-jdk-21-and-22-jammy
 gradle:8-jdk-alpine
 gradle:8-jdk-focal
 gradle:8-jdk-graal
 gradle:8-jdk-graal-jammy
 gradle:8-jdk-jammy
+gradle:8-jdk-lts-and-current
+gradle:8-jdk-lts-and-current-alpine
+gradle:8-jdk-lts-and-current-graal
+gradle:8-jdk-lts-and-current-graal-jammy
+gradle:8-jdk-lts-and-current-jammy
 gradle:8.7
 gradle:8.7-alpine
 gradle:8.7-focal
@@ -167,11 +177,21 @@ gradle:8.7-jdk21-alpine
 gradle:8.7-jdk21-graal
 gradle:8.7-jdk21-graal-jammy
 gradle:8.7-jdk21-jammy
+gradle:8.7-jdk-21-and-22
+gradle:8.7-jdk-21-and-22-alpine
+gradle:8.7-jdk-21-and-22-graal
+gradle:8.7-jdk-21-and-22-graal-jammy
+gradle:8.7-jdk-21-and-22-jammy
 gradle:8.7-jdk-alpine
 gradle:8.7-jdk-focal
 gradle:8.7-jdk-graal
 gradle:8.7-jdk-graal-jammy
 gradle:8.7-jdk-jammy
+gradle:8.7-jdk-lts-and-current
+gradle:8.7-jdk-lts-and-current-alpine
+gradle:8.7-jdk-lts-and-current-graal
+gradle:8.7-jdk-lts-and-current-graal-jammy
+gradle:8.7-jdk-lts-and-current-jammy
 gradle:8.7.0
 gradle:8.7.0-alpine
 gradle:8.7.0-focal
@@ -197,11 +217,21 @@ gradle:8.7.0-jdk21-alpine
 gradle:8.7.0-jdk21-graal
 gradle:8.7.0-jdk21-graal-jammy
 gradle:8.7.0-jdk21-jammy
+gradle:8.7.0-jdk-21-and-22
+gradle:8.7.0-jdk-21-and-22-alpine
+gradle:8.7.0-jdk-21-and-22-graal
+gradle:8.7.0-jdk-21-and-22-graal-jammy
+gradle:8.7.0-jdk-21-and-22-jammy
 gradle:8.7.0-jdk-alpine
 gradle:8.7.0-jdk-focal
 gradle:8.7.0-jdk-graal
 gradle:8.7.0-jdk-graal-jammy
 gradle:8.7.0-jdk-jammy
+gradle:8.7.0-jdk-lts-and-current
+gradle:8.7.0-jdk-lts-and-current-alpine
+gradle:8.7.0-jdk-lts-and-current-graal
+gradle:8.7.0-jdk-lts-and-current-graal-jammy
+gradle:8.7.0-jdk-lts-and-current-jammy
 gradle:alpine
 gradle:focal
 gradle:graal
@@ -226,9 +256,19 @@ gradle:jdk21-alpine
 gradle:jdk21-graal
 gradle:jdk21-graal-jammy
 gradle:jdk21-jammy
+gradle:jdk-21-and-22
+gradle:jdk-21-and-22-alpine
+gradle:jdk-21-and-22-graal
+gradle:jdk-21-and-22-graal-jammy
+gradle:jdk-21-and-22-jammy
 gradle:jdk-alpine
 gradle:jdk-focal
 gradle:jdk-graal
 gradle:jdk-graal-jammy
 gradle:jdk-jammy
+gradle:jdk-lts-and-current
+gradle:jdk-lts-and-current-alpine
+gradle:jdk-lts-and-current-graal
+gradle:jdk-lts-and-current-graal-jammy
+gradle:jdk-lts-and-current-jammy
 gradle:latest
diff --git a/gradle_jdk21-alpine/Dockerfile b/gradle_jdk-21-and-22-alpine/Dockerfile
similarity index 67%
copy from gradle_jdk21-alpine/Dockerfile
copy to gradle_jdk-21-and-22-alpine/Dockerfile
index b2714e5..c089b58 100644
--- a/gradle_jdk21-alpine/Dockerfile
+++ b/gradle_jdk-21-and-22-alpine/Dockerfile
@@ -1,5 +1,13 @@
+FROM eclipse-temurin:22-jdk-alpine AS java_current
+
 FROM eclipse-temurin:21-jdk-alpine
 
+COPY --from=java_current /opt/java/openjdk /opt/java/openjdk22
+RUN set -o errexit -o nounset \
+    && ln -s /opt/java/openjdk /opt/java/openjdk21
+ENV JAVA_CURRENT_HOME /opt/java/openjdk22
+ENV JAVA_LTS_HOME /opt/java/openjdk21
+
 CMD ["gradle"]
 
 ENV GRADLE_HOME /opt/gradle
@@ -10,10 +18,14 @@ RUN set -o errexit -o nounset \
     && adduser --system --ingroup gradle --uid 1000 --shell /bin/ash gradle \
     && mkdir /home/gradle/.gradle \
     && chown -R gradle:gradle /home/gradle \
-    && chmod -R o+rwx /home/gradle \
     \
     && echo "Symlinking root Gradle cache to gradle Gradle cache" \
-    && ln -s /home/gradle/.gradle /root/.gradle
+    && ln -s /home/gradle/.gradle /root/.gradle \
+   \
+   && echo "Ensuring Gradle detects installed JDKs" \
+   && echo "org.gradle.java.installations.auto-detect=false" > /home/gradle/.gradle/gradle.properties \
+   && echo "org.gradle.java.installations.auto-download=false" >> /home/gradle/.gradle/gradle.properties \
+   && echo "org.gradle.java.installations.fromEnv=JAVA_LTS_HOME,JAVA_CURRENT_HOME" >> /home/gradle/.gradle/gradle.properties
 
 VOLUME /home/gradle/.gradle
 
diff --git a/gradle_jdk21-graal-jammy/Dockerfile b/gradle_jdk-21-and-22-graal-jammy/Dockerfile
similarity index 56%
copy from gradle_jdk21-graal-jammy/Dockerfile
copy to gradle_jdk-21-and-22-graal-jammy/Dockerfile
index f69de99..8bea2ca 100644
--- a/gradle_jdk21-graal-jammy/Dockerfile
+++ b/gradle_jdk-21-and-22-graal-jammy/Dockerfile
@@ -9,11 +9,14 @@ RUN set -o errexit -o nounset \
     && groupadd --system --gid 1000 gradle \
     && useradd --system --gid gradle --uid 1000 --shell /bin/bash --create-home gradle \
     && mkdir /home/gradle/.gradle \
-    && chown --recursive gradle:gradle /home/gradle \
-    && chmod -R o+rwx /home/gradle \
     \
     && echo "Symlinking root Gradle cache to gradle Gradle cache" \
-    && ln --symbolic /home/gradle/.gradle /root/.gradle
+    && ln --symbolic /home/gradle/.gradle /root/.gradle \
+   \
+   && echo "Ensuring Gradle detects installed JDKs" \
+   && echo "org.gradle.java.installations.auto-detect=false" > /home/gradle/.gradle/gradle.properties \
+   && echo "org.gradle.java.installations.auto-download=false" >> /home/gradle/.gradle/gradle.properties \
+   && echo "org.gradle.java.installations.fromEnv=JAVA_LTS_HOME,JAVA_CURRENT_HOME" >> /home/gradle/.gradle/gradle.properties
 
 VOLUME /home/gradle/.gradle
 
@@ -54,29 +57,54 @@ RUN set -o errexit -o nounset \
     && which svn
 
 ENV JAVA_HOME=/opt/java/graalvm
-ENV JAVA_VERSION=21.0.2
+ENV JAVA_LTS_HOME /opt/java/graalvm21
+ENV JAVA_CURRENT_HOME /opt/java/graalvm22
 RUN set -o errexit -o nounset \
     && mkdir /opt/java \
     \
-    && echo "Downloading GraalVM" \
+    && echo "Downloading LTS GraalVM" \
+    && JDK_VERSION=21.0.2 \
     && GRAALVM_AMD64_DOWNLOAD_SHA256=b048069aaa3a99b84f5b957b162cc181a32a4330cbc35402766363c5be76ae48 \
     && GRAALVM_AARCH64_DOWNLOAD_SHA256=a34be691ce68f0acf4655c7c6c63a9a49ed276a11859d7224fd94fc2f657cd7a \
     && ARCHITECTURE=$(dpkg --print-architecture) \
     && if [ "${ARCHITECTURE}" = "amd64" ]; then GRAALVM_ARCHITECTURE=linux-x64; fi \
     && if [ "${ARCHITECTURE}" = "arm64" ]; then GRAALVM_ARCHITECTURE=linux-aarch64; fi \
-    && GRAALVM_PKG=https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-${JAVA_VERSION}/graalvm-community-jdk-${JAVA_VERSION}_${GRAALVM_ARCHITECTURE}_bin.tar.gz \
+    && GRAALVM_PKG=https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-${JDK_VERSION}/graalvm-community-jdk-${JDK_VERSION}_${GRAALVM_ARCHITECTURE}_bin.tar.gz \
+    && wget --no-verbose --output-document=graalvm.tar.gz "${GRAALVM_PKG}" \
+    \
+    && echo "Checking LTS GraalVM download hash" \
+    && if [ "${ARCHITECTURE}" = "amd64" ]; then GRAALVM_DOWNLOAD_SHA256="${GRAALVM_AMD64_DOWNLOAD_SHA256}"; fi \
+    && if [ "${ARCHITECTURE}" = "arm64" ]; then GRAALVM_DOWNLOAD_SHA256="${GRAALVM_AARCH64_DOWNLOAD_SHA256}"; fi \
+    && echo "${GRAALVM_DOWNLOAD_SHA256} *graalvm.tar.gz" | sha256sum --check - \
+    \
+    && echo "Installing LTS GraalVM" \
+    && tar --extract --gunzip --file graalvm.tar.gz \
+    && rm graalvm.tar.gz \
+    && mv graalvm-* /opt/java/graalvm21 \
+    \
+    && echo "Downloading current GraalVM" \
+    && JDK_VERSION=22.0.0 \
+    && GRAALVM_AMD64_DOWNLOAD_SHA256=e5eeb486a23101753f18181d002c3ede9da13c463fb61d3ea448abe774db0657 \
+    && GRAALVM_AARCH64_DOWNLOAD_SHA256=da9a0e11b110ebccff33ade502516d00f574ec3247868007e452cef4143e0904 \
+    && ARCHITECTURE=$(dpkg --print-architecture) \
+    && if [ "${ARCHITECTURE}" = "amd64" ]; then GRAALVM_ARCHITECTURE=linux-x64; fi \
+    && if [ "${ARCHITECTURE}" = "arm64" ]; then GRAALVM_ARCHITECTURE=linux-aarch64; fi \
+    && GRAALVM_PKG=https://github.com/graalvm/graalvm-ce-builds/releases/download/jdk-${JDK_VERSION}/graalvm-community-jdk-${JDK_VERSION}_${GRAALVM_ARCHITECTURE}_bin.tar.gz \
     && wget --no-verbose --output-document=graalvm.tar.gz "${GRAALVM_PKG}" \
     \
-    && echo "Checking GraalVM download hash" \
+    && echo "Checking current GraalVM download hash" \
     && if [ "${ARCHITECTURE}" = "amd64" ]; then GRAALVM_DOWNLOAD_SHA256="${GRAALVM_AMD64_DOWNLOAD_SHA256}"; fi \
     && if [ "${ARCHITECTURE}" = "arm64" ]; then GRAALVM_DOWNLOAD_SHA256="${GRAALVM_AARCH64_DOWNLOAD_SHA256}"; fi \
     && echo "${GRAALVM_DOWNLOAD_SHA256} *graalvm.tar.gz" | sha256sum --check - \
     \
-    && echo "Installing GraalVM" \
+    && echo "Installing current GraalVM" \
     && tar --extract --gunzip --file graalvm.tar.gz \
     && rm graalvm.tar.gz \
-    && mv graalvm-* "${JAVA_HOME}" \
-    && for bin in "$JAVA_HOME/bin/"*; do \
+    && mv graalvm-* /opt/java/graalvm22 \
+    \
+    && echo "Default Java to LTS GraalVM" \
+    && ln --symbolic /opt/java/graalvm21 /opt/java/graalvm \
+    && for bin in /opt/java/graalvm21/bin/*; do \
         base="$(basename "$bin")"; \
         [ ! -e "/usr/bin/$base" ]; \
         update-alternatives --install "/usr/bin/${base}" "${base}" "${bin}" 1; \
@@ -100,12 +128,10 @@ RUN set -o errexit -o nounset \
     && unzip gradle.zip \
     && rm gradle.zip \
     && mv "gradle-${GRADLE_VERSION}" "${GRADLE_HOME}/" \
-    && ln --symbolic "${GRADLE_HOME}/bin/gradle" /usr/bin/gradle
-
-USER gradle
-
-RUN set -o errexit -o nounset \
+    && ln --symbolic "${GRADLE_HOME}/bin/gradle" /usr/bin/gradle \
+    \
     && echo "Testing Gradle installation" \
-    && gradle --version
-
-USER root
+    && gradle --version \
+    \
+    # chown last so that it applies to /home/gradle/.gradle/native
+    && chown --recursive gradle:gradle /home/gradle
diff --git a/gradle_jammy/Dockerfile b/gradle_jdk-21-and-22-jammy/Dockerfile
similarity index 68%
copy from gradle_jammy/Dockerfile
copy to gradle_jdk-21-and-22-jammy/Dockerfile
index 8efa101..d265656 100644
--- a/gradle_jammy/Dockerfile
+++ b/gradle_jdk-21-and-22-jammy/Dockerfile
@@ -1,5 +1,13 @@
+FROM eclipse-temurin:22-jdk-jammy AS java_current
+
 FROM eclipse-temurin:21-jdk-jammy
 
+COPY --from=java_current /opt/java/openjdk /opt/java/openjdk22
+RUN set -o errexit -o nounset \
+    && ln --symbolic /opt/java/openjdk /opt/java/openjdk21
+ENV JAVA_LTS_HOME /opt/java/openjdk21
+ENV JAVA_CURRENT_HOME /opt/java/openjdk22
+
 CMD ["gradle"]
 
 ENV GRADLE_HOME /opt/gradle
@@ -10,10 +18,14 @@ RUN set -o errexit -o nounset \
     && useradd --system --gid gradle --uid 1000 --shell /bin/bash --create-home gradle \
     && mkdir /home/gradle/.gradle \
     && chown --recursive gradle:gradle /home/gradle \
-    && chmod --recursive o+rwx /home/gradle \
     \
     && echo "Symlinking root Gradle cache to gradle Gradle cache" \
-    && ln --symbolic /home/gradle/.gradle /root/.gradle
+    && ln --symbolic /home/gradle/.gradle /root/.gradle \
+    \
+    && echo "Ensuring Gradle detects installed JDKs" \
+    && echo "org.gradle.java.installations.auto-detect=false" > /home/gradle/.gradle/gradle.properties \
+    && echo "org.gradle.java.installations.auto-download=false" >> /home/gradle/.gradle/gradle.properties \
+    && echo "org.gradle.java.installations.fromEnv=JAVA_LTS_HOME,JAVA_CURRENT_HOME" >> /home/gradle/.gradle/gradle.properties
 
 VOLUME /home/gradle/.gradle
 
@@ -46,19 +58,14 @@ RUN set -o errexit -o nounset \
     && echo "Downloading Gradle" \
     && wget --no-verbose --output-document=gradle.zip "https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip" \
     \
-    && echo "Checking Gradle download hash" \
+    && echo "Checking download hash" \
     && echo "${GRADLE_DOWNLOAD_SHA256} *gradle.zip" | sha256sum --check - \
     \
     && echo "Installing Gradle" \
     && unzip gradle.zip \
     && rm gradle.zip \
     && mv "gradle-${GRADLE_VERSION}" "${GRADLE_HOME}/" \
-    && ln --symbolic "${GRADLE_HOME}/bin/gradle" /usr/bin/gradle
-
-USER gradle
-
-RUN set -o errexit -o nounset \
+    && ln --symbolic "${GRADLE_HOME}/bin/gradle" /usr/bin/gradle \
+    \
     && echo "Testing Gradle installation" \
     && gradle --version
-
-USER root

Relevant Maintainers:

  • gradle: @keeganwitt

github-actions[bot] avatar May 20 '24 22:05 github-actions[bot]

Not a bocker but would it be possible to use more descriptive variable name and make them ENV to help readability. Something like

ENV JDK_VERSION_LTS=21.0.2
ENV JDK_VERSION_CURRENT=22.0.0

LaurentGoderre avatar May 21 '24 13:05 LaurentGoderre

Not a bocker but would it be possible to use more descriptive variable name and make them ENV to help readability. Something like

ENV JDK_VERSION_LTS=21.0.2
ENV JDK_VERSION_CURRENT=22.0.0

I can see why it might be useful to have this metadata, but the versions (except for the Graal image) aren't directly controlled by me and when the upstream Adoptium image gets a security patch for the JVM, we'd be shipping with the wrong version in the env var until someone notices and I manually apply a fix.

keeganwitt avatar May 21 '24 14:05 keeganwitt

If you wanted to condense it a little, you could combine the FROM and the COPY, but it is fine either way.

-FROM eclipse-temurin:22-jdk-alpine AS java_current
-
 FROM eclipse-temurin:21-jdk-alpine

-COPY --from=java_current /opt/java/openjdk /opt/java/openjdk22
+COPY --from=eclipse-temurin:22-jdk-alpine /opt/java/openjdk /opt/java/openjdk22

If you didn't want the repeated graalvm install in the jdk-21-and-22-graal image, you could even have gradle:8.7.0-jdk-21-and-22-graal have a COPY --from=gradle:8.7.0-jdk21-graal. Docker Official Images can correctly order the build dependency, but that makes it a little more complex to test in your own repo.

yosifkit avatar May 21 '24 23:05 yosifkit