official-images
official-images copied to clipboard
Add lts-and-current images to allow Gradle to use Java 22
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.
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
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:)
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.
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?
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.
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:
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
.
Yeah, it's got very similar logic. :disappointed:
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.
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?
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.
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
In
gradle:jdk-21-and-22-jammy
and-alpine
the Dockerfiles setJAVA_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.
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
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
Not a bocker but would it be possible to use more descriptive variable name and make them
ENV
to help readability. Something likeENV 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.
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.