I've been attempting to learn Docker and specifically Docker Compose for my home network. I have a number of other containers I've been able to successfully deploy, but I'm still learning/experimenting. My recent project is to attempt creating a Keycloak container, but I've been struggling with my database connection.
I've been adapting the instructions found on Running Keycloak in a Container and found examples of Docker Compose configurations. Here is what I have so far for my Docker Compose file:
version: '3.6'
services:
keycloak_web:
image: quay.io/keycloak/keycloak:23.0.2
container_name: keycloak_web
environment:
KC_DB: postgres
KC_DB_URL: jdbc:postgresql://keycloakdb:5432/keycloak
KC_DB_USERNAME: keycloak
KC_DB_PASSWORD: keycloak
KC_HOSTNAME: localhost
KC_HOSTNAME_PORT: 8080
KC_HOSTNAME_STRICT: 'false'
KC_HOSTNAME_STRICT_HTTPS: 'false'
KC_LOG_LEVEL: info
KC_METRICS_ENABLED: 'true'
KC_HEALTH_ENABLED: 'true'
command: start-dev
depends_on:
- keycloakdb
ports:
- '8080:8080'
keycloakdb:
image: postgres:16
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_DB: keycloak
POSTGRES_USER: keycloak
POSTGRES_PASSWORD: keycloak
volumes:
postgres_data:
When I attempt to bring my container online, I receive the following error (which indicates a database connection error):
Starting data_keycloakdb_1 ... done
Recreating keycloak_web ... done
Attaching to keycloak_web
keycloak_web | Updating the configuration and installing your custom providers, if any. Please wait.
keycloak_web | 2024-02-28 01:05:44,993 INFO [io.quarkus.deployment.QuarkusAugmentor] (main) Quarkus augmentation completed in 11051ms
keycloak_web | 2024-02-28 01:05:47,100 INFO [org.keycloak.quarkus.runtime.hostname.DefaultHostnameProvider] (main) Hostname settings: Base URL: <unset>, Hostname: localhost, Strict HTTPS: false, Path: <request>, Strict BackChannel: false, Admin URL: <unset>, Admin: <request>, Port: 8080, Proxied: false
keycloak_web | 2024-02-28 01:05:49,123 WARN [io.quarkus.agroal.runtime.DataSources] (main) Datasource <default> enables XA but transaction recovery is not enabled. Please enable transaction recovery by setting quarkus.transaction-manager.enable-recovery=true, otherwise data may be lost if the application is terminated abruptly
keycloak_web | 2024-02-28 01:05:49,293 WARN [org.infinispan.PERSISTENCE] (keycloak-cache-init) ISPN000554: jboss-marshalling is deprecated and planned for removal
keycloak_web | 2024-02-28 01:05:49,350 WARN [org.infinispan.CONFIG] (keycloak-cache-init) ISPN000569: Unable to persist Infinispan internal caches as no global state enabled
keycloak_web | 2024-02-28 01:05:49,455 INFO [org.infinispan.CONTAINER] (keycloak-cache-init) ISPN000556: Starting user marshaller 'org.infinispan.jboss.marshalling.core.JBossUserMarshaller'
keycloak_web | 2024-02-28 01:05:49,470 WARN [io.agroal.pool] (agroal-11) Datasource '<default>': The connection attempt failed.
keycloak_web | 2024-02-28 01:05:49,472 WARN [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator] (JPA Startup Thread) HHH000342: Could not obtain connection to query metadata: java.lang.NullPointerException: Cannot invoke "org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(java.sql.SQLException, String)" because the return value of "org.hibernate.resource.transaction.backend.jta.internal.JtaIsolationDelegate.sqlExceptionHelper()" is null
keycloak_web | at org.hibernate.resource.transaction.backend.jta.internal.JtaIsolationDelegate.doTheWork(JtaIsolationDelegate.java:186)
keycloak_web | at org.hibernate.resource.transaction.backend.jta.internal.JtaIsolationDelegate.lambda$delegateWork$1(JtaIsolationDelegate.java:75)
keycloak_web | at org.hibernate.resource.transaction.backend.jta.internal.JtaIsolationDelegate.doInSuspendedTransaction(JtaIsolationDelegate.java:107)
keycloak_web | at org.hibernate.resource.transaction.backend.jta.internal.JtaIsolationDelegate.delegateWork(JtaIsolationDelegate.java:72)
keycloak_web | at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.getJdbcEnvironmentUsingJdbcMetadata(JdbcEnvironmentInitiator.java:279)
keycloak_web | at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:193)
keycloak_web | at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:69)
keycloak_web | at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:119)
keycloak_web | at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:264)
keycloak_web | at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:239)
keycloak_web | at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:216)
keycloak_web | at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:52)
keycloak_web | at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:125)
keycloak_web | at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:248)
keycloak_web | at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:216)
keycloak_web | at org.hibernate.boot.internal.SessionFactoryOptionsBuilder.<init>(SessionFactoryOptionsBuilder.java:273)
keycloak_web | at io.quarkus.hibernate.orm.runtime.recording.PrevalidatedQuarkusMetadata.buildSessionFactoryOptionsBuilder(PrevalidatedQuarkusMetadata.java:70)
keycloak_web | at io.quarkus.hibernate.orm.runtime.boot.FastBootEntityManagerFactoryBuilder.build(FastBootEntityManagerFactoryBuilder.java:81)
keycloak_web | at io.quarkus.hibernate.orm.runtime.FastBootHibernatePersistenceProvider.createEntityManagerFactory(FastBootHibernatePersistenceProvider.java:74)
keycloak_web | at jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:80)
keycloak_web | at jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
keycloak_web | at io.quarkus.hibernate.orm.runtime.JPAConfig$LazyPersistenceUnit.get(JPAConfig.java:156)
keycloak_web | at io.quarkus.hibernate.orm.runtime.JPAConfig$1.run(JPAConfig.java:64)
keycloak_web | at java.base/java.lang.Thread.run(Thread.java:840)
keycloak_web |
keycloak_web | 2024-02-28 01:05:50,519 INFO [org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory] (main) Node name: node_227989, Site name: null
keycloak_web | 2024-02-28 01:05:50,522 INFO [org.keycloak.broker.provider.AbstractIdentityProviderMapper] (main) Registering class org.keycloak.broker.provider.mappersync.ConfigSyncEventListener
keycloak_web | 2024-02-28 01:05:50,530 WARN [io.agroal.pool] (agroal-11) Datasource '<default>': The connection attempt failed.
keycloak_web | 2024-02-28 01:05:50,572 ERROR [org.keycloak.quarkus.runtime.cli.ExecutionExceptionHandler] (main) ERROR: Failed to start server in (development) mode
keycloak_web | 2024-02-28 01:05:50,572 ERROR [org.keycloak.quarkus.runtime.cli.ExecutionExceptionHandler] (main) ERROR: Failed to obtain JDBC connection
keycloak_web | 2024-02-28 01:05:50,572 ERROR [org.keycloak.quarkus.runtime.cli.ExecutionExceptionHandler] (main) ERROR: The connection attempt failed.
keycloak_web | 2024-02-28 01:05:50,572 ERROR [org.keycloak.quarkus.runtime.cli.ExecutionExceptionHandler] (main) ERROR: keycloakdb
keycloak_web | 2024-02-28 01:05:50,573 ERROR [org.keycloak.quarkus.runtime.cli.ExecutionExceptionHandler] (main) For more details run the same command passing the '--verbose' option. Also you can use '--help' to see the details about the usage of the particular command.
Additionally, I've tried a bunch of different iterations of the Docker networking, database URL settings, and I've changed the KC_DB_URL to breakout KC_DB_HOSTNAME, KC_DB_PORT, etc. explicitly.
Any help or pointer in the right direction would be greatly appreciated. Thank you in advance.
The postgres
version is matter
KC_DB_USERNAME
andKC_DB_PASSWORD
can't use same string.
This docker-compose.yml
file will work
version: '3.6'
services:
keycloak_web:
image: quay.io/keycloak/keycloak:23.0.7
container_name: keycloak_web
environment:
KC_DB: postgres
KC_DB_URL: jdbc:postgresql://keycloakdb:5432/keycloak
KC_DB_USERNAME: keycloak
KC_DB_PASSWORD: password
KC_HOSTNAME: localhost
KC_HOSTNAME_PORT: 8080
KC_HOSTNAME_STRICT: false
KC_HOSTNAME_STRICT_HTTPS: false
KC_LOG_LEVEL: info
KC_METRICS_ENABLED: true
KC_HEALTH_ENABLED: true
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: admin
command: start-dev
depends_on:
- keycloakdb
ports:
- 8080:8080
keycloakdb:
image: postgres:15
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_DB: keycloak
POSTGRES_USER: keycloak
POSTGRES_PASSWORD: password
volumes:
postgres_data:
Attaching to keycloakdb-1, keycloak_web
keycloakdb-1 |
keycloakdb-1 | PostgreSQL Database directory appears to contain a database; Skipping initialization
keycloakdb-1 |
keycloakdb-1 | 2024-02-28 03:48:28.026 UTC [1] LOG: starting PostgreSQL 15.6 (Debian 15.6-1.pgdg120+2) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
keycloakdb-1 | 2024-02-28 03:48:28.027 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
keycloakdb-1 | 2024-02-28 03:48:28.027 UTC [1] LOG: listening on IPv6 address "::", port 5432
keycloakdb-1 | 2024-02-28 03:48:28.042 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
keycloakdb-1 | 2024-02-28 03:48:28.058 UTC [29] LOG: database system was interrupted; last known up at 2024-02-28 03:48:01 UTC
keycloak_web | Updating the configuration and installing your custom providers, if any. Please wait.
keycloakdb-1 | 2024-02-28 03:48:29.325 UTC [29] LOG: database system was not properly shut down; automatic recovery in progress
keycloakdb-1 | 2024-02-28 03:48:29.330 UTC [29] LOG: invalid record length at 0/1D580F0: wanted 24, got 0
keycloakdb-1 | 2024-02-28 03:48:29.330 UTC [29] LOG: redo is not required
keycloakdb-1 | 2024-02-28 03:48:29.341 UTC [27] LOG: checkpoint starting: end-of-recovery immediate wait
keycloakdb-1 | 2024-02-28 03:48:29.381 UTC [27] LOG: checkpoint complete: wrote 3 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.010 s, sync=0.011 s, total=0.045 s; sync files=2, longest=0.007 s, average=0.006 s; distance=0 kB, estimate=0 kB
keycloakdb-1 | 2024-02-28 03:48:29.388 UTC [1] LOG: database system is ready to accept connections
keycloak_web | 2024-02-28 03:48:36,877 INFO [io.quarkus.deployment.QuarkusAugmentor] (main) Quarkus augmentation completed in 7132ms
keycloak_web | 2024-02-28 03:48:38,000 INFO [org.keycloak.quarkus.runtime.hostname.DefaultHostnameProvider] (main) Hostname settings: Base URL: <unset>, Hostname: localhost, Strict HTTPS: false, Path: <request>, Strict BackChannel: false, Admin URL: <unset>, Admin: <request>, Port: 8080, Proxied: false
keycloak_web | 2024-02-28 03:48:39,079 WARN [io.quarkus.agroal.runtime.DataSources] (main) Datasource <default> enables XA but transaction recovery is not enabled. Please enable transaction recovery by setting quarkus.transaction-manager.enable-recovery=true, otherwise data may be lost if the application is terminated abruptly
keycloakdb-1 | 2024-02-28 03:48:39.232 UTC [33] WARNING: database "keycloak" has a collation version mismatch
keycloakdb-1 | 2024-02-28 03:48:39.232 UTC [33] DETAIL: The database was created using collation version 2.31, but the operating system provides version 2.36.
keycloakdb-1 | 2024-02-28 03:48:39.232 UTC [33] HINT: Rebuild all objects in this database that use the default collation and run ALTER DATABASE keycloak REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.
keycloak_web | 2024-02-28 03:48:39,423 WARN [org.infinispan.PERSISTENCE] (keycloak-cache-init) ISPN000554: jboss-marshalling is deprecated and planned for removal
keycloak_web | 2024-02-28 03:48:39,475 WARN [org.infinispan.CONFIG] (keycloak-cache-init) ISPN000569: Unable to persist Infinispan internal caches as no global state enabled
keycloak_web | 2024-02-28 03:48:39,538 INFO [org.infinispan.CONTAINER] (keycloak-cache-init) ISPN000556: Starting user marshaller 'org.infinispan.jboss.marshalling.core.JBossUserMarshaller'
keycloak_web | 2024-02-28 03:48:39,922 INFO [org.keycloak.broker.provider.AbstractIdentityProviderMapper] (main) Registering class org.keycloak.broker.provider.mappersync.ConfigSyncEventListener
keycloak_web | 2024-02-28 03:48:40,184 INFO [org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory] (main) Node name: node_838099, Site name: null
keycloakdb-1 | 2024-02-28 03:48:40.393 UTC [34] WARNING: database "keycloak" has a collation version mismatch
keycloakdb-1 | 2024-02-28 03:48:40.393 UTC [34] DETAIL: The database was created using collation version 2.31, but the operating system provides version 2.36.
keycloakdb-1 | 2024-02-28 03:48:40.393 UTC [34] HINT: Rebuild all objects in this database that use the default collation and run ALTER DATABASE keycloak REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.
keycloak_web | 2024-02-28 03:48:40,813 INFO [io.quarkus] (main) Keycloak 23.0.7 on JVM (powered by Quarkus 3.2.10.Final) started in 3.856s. Listening on: http://0.0.0.0:8080
keycloak_web | 2024-02-28 03:48:40,813 INFO [io.quarkus] (main) Profile dev activated.
keycloak_web | 2024-02-28 03:48:40,813 INFO [io.quarkus] (main) Installed features: [agroal, cdi, hibernate-orm, jdbc-h2, jdbc-mariadb, jdbc-mssql, jdbc-mysql, jdbc-oracle, jdbc-postgresql, keycloak, logging-gelf, micrometer, narayana-jta, reactive-routes, resteasy-reactive, resteasy-reactive-jackson, smallrye-context-propagation, smallrye-health, vertx]
keycloak_web | 2024-02-28 03:48:40,863 WARN [org.keycloak.quarkus.runtime.KeycloakMain] (main) Running the server in development mode. DO NOT use this configuration in production.
keycloakdb-1 | 2024-02-28 03:49:29.450 UTC [35] WARNING: database "keycloak" has a collation version mismatch
keycloakdb-1 | 2024-02-28 03:49:29.450 UTC [35] DETAIL: The database was created using collation version 2.31, but the operating system provides version 2.36.
keycloakdb-1 | 2024-02-28 03:49:29.450 UTC [35] HINT: Rebuild all objects in this database that use the default collation and run ALTER DATABASE keycloak REFRESH COLLATION VERSION, or build PostgreSQL with the right library version.
http://localhost:8080/admin/master/console/
username and password is admin
In here, more latest version of docker-compose.yml