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
Le problème ne se produit plus maintenant. Je vote pour clore la question.