web-dev-qa-db-fra.com

Le serveur Keycloak dans Docker ne démarre pas en mode autonome?

Eh bien, comme le titre le suggère, il s'agit davantage d'un dossier de problème. J'essayais de suivre les instructions à ce sujet README fichier d'images du serveur docker Keycloak, mais j'ai rencontré quelques bloqueurs.

Après avoir tiré l'image, la commande ci-dessous pour démarrer une instance autonome a échoué.

docker run jboss/keycloak

La trace de la pile d'erreurs:

-b 0.0.0.0
=========================================================================

  Using PostgreSQL database

=========================================================================

...

04:45:06,084 INFO  [io.smallrye.metrics] (MSC service thread 1-5) Converted [2] config entries and added [4] replacements
04:45:06,096 ERROR [org.jboss.as.controller.management-operation] (ServerService Thread Pool -- 33) WFLYCTL0013: Operation ("add") failed - address: ([
    ("subsystem" => "datasources"),
    ("data-source" => "KeycloakDS")
]) - failure description: "WFLYCTL0113: '' is an invalid value for parameter user-name. Values must have a minimum length of 1 characters"
...
Caused by: Java.lang.RuntimeException: Failed to connect to database
    at org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.getConnection(DefaultJpaConnectionProviderFactory.Java:382)
...
Caused by: javax.naming.NameNotFoundException: datasources/KeycloakDS -- service jboss.naming.context.Java.jboss.datasources.KeycloakDS
    at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.Java:106)
...

Je me demandais comment il utilise une base de données PostgreSQL, et j'ai supposé qu'il pourrait créer sa propre instance. Mais l'erreur semble avoir un problème de connexion à la base de données.

Le passage à la base de données H2 intégrée l'a fait fonctionner.

docker run -e DB_VENDOR="h2" --name docker-keycloak-h2 jboss/keycloak

Le fichier docker-entrypoint.sh montre qu'il utilise la logique ci-dessous pour déterminer la base de données à utiliser.

if (getent hosts postgres &>/dev/null); then
        export DB_VENDOR="postgres"
...

Et plus loin dans le flux, ce fichier change-database.cli indique qu'il s'attend réellement à ce qu'une instance PostgreSQL en cours d'exécution utilise.

connection-url=jdbc:postgresql://${env.DB_ADDR:postgres}:${env.DB_PORT:5432}/${env.DB_DATABASE:keycloak}${env.JDBC_PARAMS:}

J'ai donc commencé à me demander comment PostgreSQL a été choisi par défaut au départ. L'exécution des commandes ci-dessous dans un conteneur Docker Keycloak en cours d'exécution a révélé des choses intéressantes.

[root@71961b81189c bin]# getent hosts postgres
69.172.201.153  postgres.mbox.com
[root@71961b81189c bin]# echo $?
0

Je ne sais pas ce que cela postgres.mbox.com est, mais apparemment, ce n'est pas un serveur PostgreSQL attendu qui doit être résolu par getent. Je ne sais pas non plus s'il s'agit d'un récent problème Linux. L'entrée hosts dans le fichier de configuration du commutateur de service de noms /etc/nsswitch.conf ressemble ci-dessous à l'intérieur du conteneur.

hosts:      files dns myhostname

C'est la source de données dns qui a résolu postgres en postgres.mbox.com.


C'est pourquoi la logique de détermination du fournisseur de base de données a échoué, ce qui a finalement entraîné le démarrage du conteneur. Les instructions sur ce fichier README ne fonctionnent pas au jour de la publication de cet article.

Voici les commandes de travail pour démarrer correctement un serveur Keycloak dans Docker avec PostgreSQL comme base de données.

docker network create keycloak-network

docker run -d --name postgres --net keycloak-network -e POSTGRES_DB=keycloak -e POSTGRES_USER=keycloak -e POSTGRES_PASSWORD=password postgres

docker run --name docker-keycloak-postgres --net keycloak-network -e DB_USER=keycloak -e DB_PASSWORD=password jboss/keycloak
7
Ruifeng Ma

Le problème ne se produit plus maintenant. Je vote pour clore la question.

0
Ruifeng Ma