Keycloak 26.8.1 build recipe

The recipe ReadyStack built readystack/keycloak:26.8.1-CE-ubuntu24.04-r1 from: the upstream source it starts from, every pinned input, and the files that run the build with the network off. Public here: the source and commit, the pinned inputs, all 24 recipe files with their sizes and SHA-256, 9 of them public in full or in part, and the opening lines of the Dockerfile and build script.

The whole recipe

Free account

An account is an email address, a username and a password: no card, no donation. It opens all 24 recipe files; the build kit itself keeps its own terms.

Upstream source

Public

github.com/keycloak/keycloak (26.8.1) at 24ed1dadf3f246a555adb6d3d4a99e9b3003fb3b

Fetched once, with the network on, by the vendor step (Dockerfile.vendor) when the kit was made; the offline build uses the kit's vendored copies:

Pinned inputs

As JSON
  • Base imageeclipse-temurin:21-jre-noble@sha256:35501d3f93173b420ac9001658eb68157e813316b865087e345c187fca422c4c
  • Base imagemaven:3.9.8-eclipse-temurin-21@sha256:de18e4e51396ad9266f76669779ed6d6b49fbb0f45ed6f39169d87378d548d7d
  • BuildKitmoby/buildkit:v0.31.2
    sha256:e0e67ea9c4bb07bdef683e29f70f3b623d1eb9c82274a9ec04e6bb0511449fb0
  • Build methodsource-rebuild-java
  • SOURCE_DATE_EPOCH1791878921 (2026-10-13T08:08:41Z)
  • Target digest (linux/amd64)sha256:004e57d43387770916aa38784d49136ae2ab76f9df9d10ee12bf0b48c87032d1
  • Target config digestsha256:74b446fde42e3334aad7386e06473733c70b10dbfe14728b4d4e9741f370e7c2
  • Checksummed kit files119,473 (CHECKSUMS.sha256)

Dockerfile Dockerfile.offline.pinned

49 lines · 5.4 KB
# GENERATED L-009 hermetic Java build (--network=none, SBOM+SLSA-attestation-producing).
# Pinned bases; vendored source + maven cache(s) + toolchain/runtime debs from Dockerfile.vendor.
FROM maven:3.9.8-eclipse-temurin-21@sha256:de18e4e51396ad9266f76669779ed6d6b49fbb0f45ed6f39169d87378d548d7d AS jbuild
# dpkg-install the vendored build toolchain (git/unzip) — no apt, fully offline.
COPY vendored/build-debs/ /tmp/bdebs/
RUN dpkg -i /tmp/bdebs/*.deb 2>/dev/null || true; \
    dpkg -i /tmp/bdebs/*.deb 2>/dev/null || true; \
    dpkg --configure -a; rm -rf /tmp/bdebs
WORKDIR /src
COPY vendored/keycloak-src/ .
COPY vendored/caches/m2/ /m2/
COPY vendored/caches/pnpm-store/ /pnpm-store/
COPY vendored/caches/pnpm-cache/ /pnpm-cache/
ENV MAVEN_OPTS="-Xmx3g"
ENV npm_config_store_dir="/pnpm-store"
ENV npm_config_cache="/pnpm-cache"
ENV MAVEN_ARGS="-Dproject.build.outputTimestamp=2026-10-13T08:08:41Z"
RUN cd /src && KC_BUILD_TIME="$(printf '%s\n' $MAVEN_ARGS | sed -n 's/^-Dproject\.build\.outputTimestamp=\([0-9]\{4\}-[0-9][0-9]-[0-9][0-9]\)T\([0-9][0-9]:[0-9][0-9]\):[0-9][0-9]Z$/\1 \2/p')" && test -n "$KC_BUILD_TIME" && echo "keycloak-version.properties build-time=$KC_BUILD_TIME" && npm_config_store_dir=/pnpm-store npm_config_cache=/pnpm-cache MAVEN_OPTS=-Xmx3g mvn "-Dtimestamp=$KC_BUILD_TIME" -o -B -pl quarkus/deployment,quarkus/dist -am -DskipTests -DskipProtoLock=true -Dmaven.build.cache.enabled=false -Dmaven.repo.local=/m2 clean install
RUN tar -xzf quarkus/dist/target/keycloak-*.tar.gz -C /opt --strip-components=0 && mv /opt/keycloak-* /opt/keycloak && mkdir -p /opt/keycloak/data
RUN mkdir -p /tmp/rs-canon && printf '%s\n' 'import java.io.*;' 'import java.nio.file.*;' '' '// Re-serializes the Quarkus lib/deployment/appmodel.dat with every String interned, so a value that occurs twice is' '// always written as one TC_STRING plus back-references. ObjectOutputStream otherwise shares a String only when the' '// in-memory model happened to hold the same instance, which varies from build to build.' 'public class AppModelCanon {' '    public static void main(String[] args) throws Exception {' '        Path in = Path.of(args[0]), out = Path.of(args.length > 1 ? args[1] : args[0]);' '        byte[] original = Files.readAllBytes(in);' '        Object model;' '        try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(original))) {' '            model = ois.readObject();' '            if (ois.read() != -1) throw new IllegalStateException("trailing data after the model in " + in);' '        }' '        ByteArrayOutputStream bytes = new ByteArrayOutputStream();' '        try (ObjectOutputStream oos = new ObjectOutputStream(bytes) {' '            { enableReplaceObject(true); }' '            @Override protected Object replaceObject(Object o) { return o instanceof String s ? s.intern() : o; }' '        }) {' '            oos.writeObject(model);' '        }' '        Files.write(out, bytes.toByteArray());' '        System.out.println("canonicalized " + in + " -> " + out + " (" + original.length + " -> " + bytes.size() + " bytes)");' '    }' '}' > /tmp/rs-canon/AppModelCanon.java && java -cp '/opt/keycloak/lib/lib/deployment/*:/opt/keycloak/lib/lib/boot/*:/opt/keycloak/lib/lib/main/*' /tmp/rs-canon/AppModelCanon.java /opt/keycloak/lib/lib/deployment/appmodel.dat && rm -rf /tmp/rs-canon
FROM eclipse-temurin:21-jre-noble@sha256:35501d3f93173b420ac9001658eb68157e813316b865087e345c187fca422c4c
ENV DEBIAN_FRONTEND=noninteractive LANG=en_US.UTF-8 KC_RUN_IN_CONTAINER=true KC_DB=postgres KC_HEALTH_ENABLED=true KC_METRICS_ENABLED=true KC_HTTP_ENABLED=true
COPY vendored/debs/ /tmp/debs/
RUN dpkg -i /tmp/debs/*.deb 2>/dev/null || true; \

Continues: 25 more lines. Create a free account to read the rest, or sign in.

Build script BUILD_OFFLINE.sh

125 lines · 6.6 KB
#!/usr/bin/env bash
# =============================================================================
# ReadyStack — offline reproducible rebuild.
#
# Rebuilds this product's image from THIS ARCHIVE ALONE, with no network access
# of any kind, and prints the resulting linux/amd64 image-manifest digest.
# Run ./VERIFY_OFFLINE.sh afterwards to assert it equals the published digest.
#
# Requirements: linux/amd64 Docker host, docker buildx >= 0.30, jq, tar.
# No git, no registry access, no additional tooling.
#
#   ./BUILD_OFFLINE.sh                the rebuild (OCI image + a docker-loadable copy)
#   ./BUILD_OFFLINE.sh --provenance   the same rebuild with SLSA v1 build provenance (mode=max) attached to the OCI
#                                     image, generated by BuildKit, not by any build step. Run on your own hardened,
#                                     isolated build platform and sign that provenance with a key the build cannot
#                                     reach, and the result meets SLSA Build Level 3 (see REBUILD.md). The image
#                                     digest is the same either way.
# =============================================================================
set -euo pipefail
PROVENANCE=0
for arg in "$@"; do
  case "$arg" in
    --provenance) PROVENANCE=1 ;;
    -h|--help) sed -n '2,20p' "$0"; exit 0 ;;

Continues: 101 more lines. Create a free account to read the rest, or sign in.

Recipe files

24 files · SHA-256 of each as published here
FileSizeSHA-256Access
BASES.tsv310 Ba16d81840456…Public · View
BUILD_OFFLINE.sh6.6 KB83299978ccd0…Opening lines public
CHECKSUMS.sha25624 MB6a57d0fd42b2…Free account
DOCKERFILE_NAME.txt26 B9aadd1ede68e…Public · View
Dockerfile5.4 KB6c41294a9d36…Free account
Dockerfile.offline5.4 KB6c41294a9d36…Free account
Dockerfile.offline.pinned5.4 KB6c41294a9d36…Opening lines public
Dockerfile.vendor6.6 KB2a72e5ccb9d8…Free account
MANIFEST.txt16 MBd365ceab63d1…Free account
SOURCE_DATE_EPOCH.txt11 B0d4cb1e30a6e…Public · View
TARGET_DIGEST.txt435 B1de021b05a29…Public · View
VERIFY_OFFLINE.sh6.8 KB520705cb939e…Free account
docs/PROVENANCE.md1.7 KB22baf88174d8…Free account
docs/REBUILD.md5.1 KB405db6779bee…Free account
docs/VERIFY.md1.9 KB4dc1049890f2…Free account
docs/provenance/BASE_IMAGE_DIGESTS.lock79 Bd8333cbb49c2…Public · View
docs/provenance/BUILD_RECIPE.json
Published with 1 redaction (internal host, line 58); the kit's own copy: 8f95876f4ff9…
16 KB2449b7752805…Free account
docs/provenance/CUSTODY_INPUTS.json650 Bafce7f110e03…Free account
docs/provenance/SOURCE_FILE_MANIFEST.json392 KB396a3dbf2fa5…Free account
docs/provenance/SOURCE_TREE_HASH.json309 B44fe67ccbeda…Public · View
docs/provenance/SYSTEM_PINNING.lock28 Bfa091140511e…Free account
docs/provenance/TOOLCHAIN.lock11 KBa2ce8d4c88c3…Free account
rebuild.json1.5 KBbe791b511c7e…Free account
toolchain/BUILDKIT_TAG.txt22 Bfcd530eeb02b…Public · View

Made from ReadyStack-keycloak-26.8.1-CE-ubuntu24.04-r1.tar.gz (SHA-256 0ad5f49ae4d09c1e8b451fd39b45c3d21528b7360991b786fff76495dd47c08c), the build kit on sale for this release, on 2026-10-29.

What the Hermetic Build Kit adds

Free with a verified email

The recipe pins every input; the kit carries them, so the build runs with the network off:

  • Vendored sources and packages91,075 files, 2.2 GB
  • Base images (OCI layouts)23 files, 323 MB
  • Handbooks, SBOM, security report and records13,530 files, 124 MB
  • Pinned BuildKit toolchain1 files, 106 MB