I'm learning how to make my own docker compose to deploy my application which consist of a quarkus back-end, mysql database and a keycloak instance for OIDC.
When starting my app locally without docker compose everything works fine, quarkus backend app is able to connect to the keycloak instance
However when I use docker compose, all container but I have this error in the logs of the quarkus app :
2023-08-15 20:11:47 2023-08-15 18:11:47,560 WARN [io.qua.oid.com.run.OidcCommonUtils] (vert.x-eventloop-thread-1) OIDC Server is not available:: io.quarkus.oidc.common.runtime.OidcEndpointAccessException
2023-08-15 20:11:47 at io.quarkus.oidc.common.runtime.OidcCommonUtils.lambda$discoverMetadata$2(OidcCommonUtils.java:406)
2023-08-15 20:11:47 at io.smallrye.context.impl.wrappers.SlowContextualFunction.apply(SlowContextualFunction.java:21)
2023-08-15 20:11:47 at io.smallrye.mutiny.operators.uni.UniOnItemTransform$UniOnItemTransformProcessor.onItem(UniOnItemTransform.java:36)
2023-08-15 20:11:47 at io.smallrye.mutiny.vertx.AsyncResultUni.lambda$subscribe$1(AsyncResultUni.java:35)
2023-08-15 20:11:47 at io.smallrye.mutiny.vertx.DelegatingHandler.handle(DelegatingHandler.java:25)
2023-08-15 20:11:47 at io.vertx.ext.web.client.impl.HttpContext.handleDispatchResponse(HttpContext.java:397)
2023-08-15 20:11:47 at io.vertx.ext.web.client.impl.HttpContext.execute(HttpContext.java:384)
2023-08-15 20:11:47 at io.vertx.ext.web.client.impl.HttpContext.next(HttpContext.java:362)
2023-08-15 20:11:47 at io.vertx.ext.web.client.impl.HttpContext.fire(HttpContext.java:329)
2023-08-15 20:11:47 at io.vertx.ext.web.client.impl.HttpContext.dispatchResponse(HttpContext.java:291)
2023-08-15 20:11:47 at io.vertx.ext.web.client.impl.HttpContext.lambda$null$7(HttpContext.java:507)
2023-08-15 20:11:47 at io.vertx.core.impl.ContextInternal.dispatch(ContextInternal.java:264)
2023-08-15 20:11:47 at io.vertx.core.impl.ContextInternal.dispatch(ContextInternal.java:246)
2023-08-15 20:11:47 at io.vertx.core.impl.EventLoopContext.lambda$runOnContext$0(EventLoopContext.java:43)
2023-08-15 20:11:47 at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
2023-08-15 20:11:47 at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
2023-08-15 20:11:47 at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
2023-08-15 20:11:47 at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:566)
2023-08-15 20:11:47 at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
2023-08-15 20:11:47 at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
2023-08-15 20:11:47 at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
2023-08-15 20:11:47 at java.base/java.lang.Thread.run(Thread.java:829)
When I look in the logs of my Keycloak container I have this error :
2023-08-15 20:11:47 2023-08-15 18:11:47,408 ERROR [org.keycloak.services.error.KeycloakErrorHandler] (executor-thread-1) Uncaught server error: java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because "requestHost" is null
2023-08-15 20:11:47 at org.keycloak.quarkus.runtime.hostname.DefaultHostnameProvider.isHostFromFrontEndUrl(DefaultHostnameProvider.java:166)
2023-08-15 20:11:47 at org.keycloak.quarkus.runtime.hostname.DefaultHostnameProvider.forNonStrictBackChannel(DefaultHostnameProvider.java:137)
2023-08-15 20:11:47 at org.keycloak.quarkus.runtime.hostname.DefaultHostnameProvider.getScheme(DefaultHostnameProvider.java:71)
2023-08-15 20:11:47 at org.keycloak.models.KeycloakUriInfo.<init>(KeycloakUriInfo.java:46)
2023-08-15 20:11:47 at org.keycloak.services.DefaultKeycloakContext.getUri(DefaultKeycloakContext.java:79)
2023-08-15 20:11:47 at org.keycloak.protocol.oidc.OIDCWellKnownProvider.getConfig(OIDCWellKnownProvider.java:116)
2023-08-15 20:11:47 at org.keycloak.services.resources.RealmsResource.getWellKnown(RealmsResource.java:238)
2023-08-15 20:11:47 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
2023-08-15 20:11:47 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
2023-08-15 20:11:47 at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
2023-08-15 20:11:47 at java.base/java.lang.reflect.Method.invoke(Method.java:568)
2023-08-15 20:11:47 at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:154)
2023-08-15 20:11:47 at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:118)
2023-08-15 20:11:47 at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:560)
2023-08-15 20:11:47 at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:452)
2023-08-15 20:11:47 at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$2(ResourceMethodInvoker.java:413)
2023-08-15 20:11:47 at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:321)
2023-08-15 20:11:47 at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:415)
2023-08-15 20:11:47 at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:378)
2023-08-15 20:11:47 at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:356)
2023-08-15 20:11:47 at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:70)
2023-08-15 20:11:47 at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:429)
2023-08-15 20:11:47 at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:240)
2023-08-15 20:11:47 at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:154)
2023-08-15 20:11:47 at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:321)
2023-08-15 20:11:47 at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:157)
2023-08-15 20:11:47 at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:229)
2023-08-15 20:11:47 at io.quarkus.resteasy.runtime.standalone.RequestDispatcher.service(RequestDispatcher.java:82)
2023-08-15 20:11:47 at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.dispatch(VertxRequestHandler.java:147)
2023-08-15 20:11:47 at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.handle(VertxRequestHandler.java:84)
2023-08-15 20:11:47 at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.handle(VertxRequestHandler.java:44)
2023-08-15 20:11:47 at io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1284)
2023-08-15 20:11:47 at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:177)
2023-08-15 20:11:47 at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:141)
2023-08-15 20:11:47 at io.quarkus.vertx.http.runtime.options.HttpServerCommonHandlers$1.handle(HttpServerCommonHandlers.java:58)
2023-08-15 20:11:47 at io.quarkus.vertx.http.runtime.options.HttpServerCommonHandlers$1.handle(HttpServerCommonHandlers.java:36)
2023-08-15 20:11:47 at io.vertx.ext.web.impl.RouteState.handleContext(RouteState.java:1284)
2023-08-15 20:11:47 at io.vertx.ext.web.impl.RoutingContextImplBase.iterateNext(RoutingContextImplBase.java:177)
2023-08-15 20:11:47 at io.vertx.ext.web.impl.RoutingContextImpl.next(RoutingContextImpl.java:141)
2023-08-15 20:11:47 at org.keycloak.quarkus.runtime.integration.web.QuarkusRequestFilter.lambda$createBlockingHandler$0(QuarkusRequestFilter.java:82)
2023-08-15 20:11:47 at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:576)
2023-08-15 20:11:47 at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)
2023-08-15 20:11:47 at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)
2023-08-15 20:11:47 at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
2023-08-15 20:11:47 at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
2023-08-15 20:11:47 at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
2023-08-15 20:11:47 at java.base/java.lang.Thread.run(Thread.java:833)
2023-08-15 20:11:47
However if I go to my quarkus app container and make a curl to my realm url I have something which looks like a correct response :
{"realm":"test","public_key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyD+RuHj/4atKTZIUUW8akqSTgFbe0n27Rzn58+Cbu9XovlJ+KG+orqtxC7/ICWsVNMMq5vRTHjo8m3d/s3r4kevStWc/4X0fs3n6pMBRVrSys9nWQKlqyHUPz3qNleoXF2VvSG872E1uLomXC24/LeyRz20GQgAhfOUM4fFql2Tmx3f0lyJdu4c5GgrQVgah5Aad8WsoDZaS7BDhzwQcAfFbvpnGQgPHR7qXk5JGIqML8gDOgElD5PLAuvIKqP9AGMYAf7jg0oM4JZCWPTwDYSKl4pYVRaRc2y2zGUp1UR2gOamnJJ4piFyHoPVNMnnVcSjx0D3CroG6Dz0X6iva1wIDAQAB","token-service":"http://keycloak_splatinfos:8080/realms/test/protocol/openid-connect","account-service":"http://keycloak_splatinfos:8080/realms/test/account","tokens-not-before":0}
This is my docker-compose.yml :
services:
keycloak_splatinfos:
image: quay.io/keycloak/keycloak:latest
command: start --hostname-strict=false --http-enabled=true --hostname-strict-https=false
environment:
KC_DB: postgres
KC_DB_URL_HOST: postgres_keycloak_splatinfos
KC_DB_URL_DATABASE: keycloak
KC_DB_PASSWORD:
KC_DB_USERNAME:
KC_DB_SCHEMA: public
KEYCLOAK_ADMIN:
KEYCLOAK_ADMIN_PASSWORD:
ports:
- "8890:8080"
volumes:
- ./providers:/opt/keycloak/providers
depends_on:
postgres_keycloak_splatinfos:
condition: service_healthy
networks:
- splat-infos_backend
postgres_keycloak_splatinfos:
image: postgres:latest
command: postgres -c 'max_connections=280'
volumes:
- pgdata_keycloak_splatinfos:/var/lib/postgresql/data
environment:
POSTGRES_DB: keycloak
POSTGRES_USER:
POSTGRES_PASSWORD:
healthcheck:
test: "exit 0"
ports:
- "5436:5432"
networks:
- splat-infos_backend
mysql_backend_splatinfos:
image: mysql:5.7
environment:
MYSQL_DATABASE: Splat_Info
MYSQL_ROOT_PASSWORD:
healthcheck:
test: "exit 0"
ports:
- "3306:3306"
volumes:
- splatinfos-db:/var/lib/mysql
- "./scripts/db.sql:/docker-entrypoint-initdb.d/1.sql"
networks:
- splat-infos_backend
backend_splat_infos:
image: spierrea/splat_infos:ry
environment:
QUARKUS_DATASOURCE_JDBC_URL: jdbc:mysql://mysql_backend_splatinfos:3306/Splat_Info
QUARKUS_DATASOURCE_PASSWORD:
QUARKUS_DATASOURCE_USERNAME:
QUARKUS_HTTP_CORS_ORIGIN: http://localhost:3000
QUARKUS_HTTP_PORT: 8081
QUARKUS_OIDC_AUTH_SERVER_URL: http://keycloak_splatinfos:8080/realms/test/
depends_on:
- keycloak_splatinfos
- mysql_backend_splatinfos
networks:
- splat-infos_backend
ports:
- "8081:8081"
volumes:
pgdata_keycloak_splatinfos:
splatinfos-db:
networks:
splat-infos_backend:
driver: bridge
I am still learning how to deploy an application, especially with docker, as I didn't find someone with a similar problem I wouldn't be surprised if my problem is something basic...
Thanks for your time !
However if I go to my quarkus app container and make a curl to my realm url I have something which looks like a correct response :
{"realm":"test","public_key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyD+RuHj/4atKTZIUUW8akqSTgFbe0n27Rzn58+Cbu9XovlJ+KG+orqtxC7/ICWsVNMMq5vRTHjo8m3d/s3r4kevStWc/4X0fs3n6pMBRVrSys9nWQKlqyHUPz3qNleoXF2VvSG872E1uLomXC24/LeyRz20GQgAhfOUM4fFql2Tmx3f0lyJdu4c5GgrQVgah5Aad8WsoDZaS7BDhzwQcAfFbvpnGQgPHR7qXk5JGIqML8gDOgElD5PLAuvIKqP9AGMYAf7jg0oM4JZCWPTwDYSKl4pYVRaRc2y2zGUp1UR2gOamnJJ4piFyHoPVNMnnVcSjx0D3CroG6Dz0X6iva1wIDAQAB","token-service":"http://keycloak_splatinfos:8080/realms/test/protocol/openid-connect","account-service":"http://keycloak_splatinfos:8080/realms/test/account","tokens-not-before":0}
I retried by starting my app without quarkus in dev mode with my keycloak instance running in dev mode too, it worked fine
I tried starting keycloak in dev mode in the docker compose, I had the same error
Please try to rename your Docker service name to contain no special characters like underscore.
For example rename from keycloak_splatinfos to keycloaksplatinfos.
I had same error and it helped.