Keycloak: identity and access management; external PostgreSQL. Signed; SBOM and SLSA v1 provenance.
5.7K
readystack/keycloak:26.8.1-CE-ubuntu24.04-r2
Source, recipe and records
26.8.1): https://github.com/keycloak/keycloak/tree/24ed1dadf3f246a555adb6d3d4a99e9b3003fb3bA cosign-signed build of github.com/keycloak/keycloak 26.8.1 (tag 26.8.1, commit 24ed1dadf3f246a555adb6d3d4a99e9b3003fb3b; Apache-2.0), built clean-room from official upstream source by ReadyStack.
Who: Developers and identity teams who need login, single sign-on and user management for their applications.
Why: Keycloak is open-source identity and access management. Users sign in to Keycloak instead of each application, which gives single sign-on and sign-out, social login, LDAP user federation and fine-grained authorization.
Use case: A company builds several internal web apps and does not want each one to store passwords. Each app hands login to Keycloak over OpenID Connect; employees sign in once with their existing directory accounts, and logging out of one app logs them out of all of them.
About the upstream project, written from its own description: https://github.com/keycloak/keycloak · https://www.keycloak.org/
Signature, user and attestations below were measured on the published digest sha256:69d62bb401f3fcc58162d09a7849c977e4aa4855d6b72e87bbd454c5890fcd67 on 2026-10-29.
04daa92344a52dbc) on this release's index digest sha256:69d62bb401f3fcc58162d09a7849c977e4aa4855d6b72e87bbd454c5890fcd67; verify with cosign verify --key https://readystack.dev/keys/cosign.pub readystack/keycloak:26.8.1-CE-ubuntu24.04-r2.keycloak).This image follows the ReadyStack release-tag convention:
The current release is 26.8.1-CE-ubuntu24.04-r2 — the release listed at readystack.dev. Release tags use the pattern <upstream-version>-CE-<base-os>-r<N>; the current one is signed, attested (SBOM + provenance), and is provided under the ReadyStack Agreement.
Earlier release tags (an older version or revision in the same pattern) are superseded. They stay pullable so existing deployments can pin them, but they are no longer re-graded, and fixes appear only in newer releases: move to the current release. For a superseded release's build kit, ask support.
Release tags never move, so pulling the same tag again never changes the image. To be offered each new release automatically (a new revision r<N+1>, or a new upstream version), use the ReadyStack Renovate preset: https://readystack.dev/updates.html
Any tag beginning with internal- is an engineering-pipeline artifact published for build observability. It is unsupported, may change or disappear without notice, and must not be used in production.
# ✓ current release
docker pull readystack/keycloak:26.8.1-CE-ubuntu24.04-r2
# ✗ unsupported (do not pull)
docker pull readystack/keycloak:internal-...
This release is signed; verify it with cosign verify --key https://readystack.dev/keys/cosign.pub readystack/keycloak:26.8.1-CE-ubuntu24.04-r2 (the signature is recorded in the public Sigstore transparency log). Support: [email protected], as set out in the ReadyStack Agreement.
Single container: a Quarkus-based Identity and Access Management server (OpenID Connect / OAuth2 / SAML provider, admin console, account console). It REQUIRES an external PostgreSQL database that you provide: point the container at it with KC_DB_URL_HOST and KC_DB_URL_DATABASE (or one KC_DB_URL JDBC string) plus KC_DB_USERNAME and KC_DB_PASSWORD. The image was pre-built for PostgreSQL (kc.sh build --db=postgres --health-enabled=true --metrics-enabled=true) and is started with start --optimized; Keycloak creates and migrates its own schema in that database on first start. NOT a docker-compose-only or Kubernetes-only product, but it is NOT self-contained: PostgreSQL is a hard external dependency (this image is built for PostgreSQL only; start-dev with embedded H2 does not run in it).
Secrets go in an env file that only you can read, not on the command line, and passwords that only set up the first start come out of it after setup. Create keycloak.env with install -m 600 /dev/null keycloak.env, then write these lines into it with an editor, with your own values (a value typed into a shell stays in its history). Docker reads each line as written: no quotes around a value, no spaces around =.
# Needed at every start: the password of KC_DB_USERNAME.
KC_DB_PASSWORD=YOUR_PW
# First start only: these two lines create the temporary administrator on an empty database. Remove KC_BOOTSTRAP_ADMIN_USERNAME and KC_BOOTSTRAP_ADMIN_PASSWORD together after setup and recreate the container; the account keeps the password.
KC_BOOTSTRAP_ADMIN_USERNAME=admin
KC_BOOTSTRAP_ADMIN_PASSWORD=YOUR_ADMIN_PW
docker run -d --name keycloak -p 8080:8080 -p 9000:9000 -e KC_DB_URL_HOST=YOUR_PG_HOST -e KC_DB_URL_DATABASE=keycloak -e KC_DB_USERNAME=keycloak --env-file ./keycloak.env readystack/keycloak:26.8.1-CE-ubuntu24.04-r2 start --optimized --hostname=https://auth.example.com --proxy-headers=xforwarded
The arguments after the image name are the start command: the ENTRYPOINT /opt/keycloak/bin/kc.sh runs them, and the image has no default command (with no arguments kc.sh prints its usage and exits). Write each password in keycloak.env as it is, without quotes: docker passes the line unchanged, so a $ or a space stays part of the password (tested: my new pass $x! logged in). Once the first start has created the temporary administrator, remove the KC_BOOTSTRAP_ADMIN_USERNAME and KC_BOOTSTRAP_ADMIN_PASSWORD lines from keycloak.env together and recreate the container (docker rm -f keycloak, then the docker run command again): the account keeps its password, which is then no longer in the container's environment (tested). Removing only the password line stops the start with bootstrap-admin-username available only when bootstrap admin password is set (tested). Always pass start --optimized and the public hostname (--hostname=https://... or -e KC_HOSTNAME=https://...); without a hostname start --optimized exits with hostname is not configured; either configure hostname, or set hostname-strict to false. This command serves plain HTTP on port 8080: it expects a TLS-terminating reverse proxy at the hostname (https://auth.example.com in the example) that forwards to port 8080 and sends X-Forwarded-* headers, which --proxy-headers=xforwarded (or -e KC_PROXY_HEADERS=xforwarded) tells Keycloak to trust; use --proxy-headers=forwarded for a proxy that sends the standard Forwarded header. Keycloak then trusts those headers from any client that reaches port 8080, so let only the proxy reach it. Without --proxy-headers Keycloak logs the warning "Likely misconfiguration detected. When using an edge proxy, you must use proxy-headers." at every start (tested; the command above logs no such warning). Requested straight from port 8080, the admin console (/admin/) redirects to the hostname, and the OIDC endpoints answer but advertise the hostname's https:// URLs (tested). To serve HTTPS from Keycloak itself instead, add -v /srv/keycloak/tls:/opt/keycloak/conf/tls:ro -e KC_HTTPS_CERTIFICATE_FILE=/opt/keycloak/conf/tls/tls.crt -e KC_HTTPS_CERTIFICATE_KEY_FILE=/opt/keycloak/conf/tls/tls.key -e KC_HTTP_MANAGEMENT_SCHEME=http -p 8443:8443 (a certificate and key the keycloak user, uid 999, can read), use the HTTPS URL clients use as the hostname (--hostname=https://auth.example.com:8443) and leave out --proxy-headers; KC_HTTP_MANAGEMENT_SCHEME=http keeps the image's health check on plain HTTP (tested: HTTPS on 8443 answered 200 and the container was healthy; the archive's handbooks give the details under HTTPS). To look inside a running container use docker exec; --entrypoint replaces kc.sh entirely.
The complete --network=none build kit for this image — plus admin/DB/API handbooks, the build's validation records, and its build provenance records — is a free download for any registered account at readystack.dev/products/keycloak. A clean-room rebuild from this release's archive on an egress-blocked host reproduced its linux/amd64 digest sha256:cfca615f377f1a00b023b1256b5f5e5978b5024fbd97ad575d28dd45c0e94839 on 2026-10-29.
— ReadyStack · readystack.dev
Content type
Image
Digest
sha256:69d62bb40…
Size
263.5 MB
Last updated
1 day ago
docker pull readystack/keycloak:26.8.1-CE-ubuntu24.04-r2