正如标题所示,这更多是一个问题记录。我试图按照Keycloak Docker服务器镜像的README文件中的指令操作,但遇到了一些问题。
拉取镜像后,以下命令启动独立实例失败。
docker run jboss/keycloak
错误栈跟踪:
-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)
...
我想知道它如何使用PostgreSQL数据库,并且假设它可能会自己启动数据库实例。 但是错误看起来像是连接数据库有问题。
更改为嵌入式H2 DB使其工作。
docker run -e DB_VENDOR="h2" --name docker-keycloak-h2 jboss/keycloak
docker-entrypoint.sh 文件显示它使用以下逻辑来确定使用哪个DB。
if (getent hosts postgres &>/dev/null); then
export DB_VENDOR="postgres"
...
在流程的更下方,这个change-database.cli文件表明它实际上需要一个正在运行的PostgreSQL实例来使用。
connection-url=jdbc:postgresql://${env.DB_ADDR:postgres}:${env.DB_PORT:5432}/${env.DB_DATABASE:keycloak}${env.JDBC_PARAMS:}
所以我开始思考PostgreSQL最初是如何被选为默认数据库的。在运行的Keycloak Docker容器中执行以下命令,发现了一些有趣的事情。
[root@71961b81189c bin]# getent hosts postgres
69.172.201.153 postgres.mbox.com
[root@71961b81189c bin]# echo $?
0
不确定这个postgres.mbox.com
是什么,但显然它不是一个通过getent
解析的预期PostgreSQL服务器。也不确定这是否是最近的Linux问题。容器中/etc/nsswitch.conf
文件中的名称服务切换配置文件中的hosts
条目如下所示。
hosts: files dns myhostname
正是dns
数据源将postgres
解析为postgres.mbox.com
。
这就是为什么DB供应商确定逻辑失败,最终导致容器启动失败。截至此篇文章发布之日,此自述文件中的说明已不起作用。
以下是正确启动使用PostgreSQL作为数据库的Keycloak服务器的工作命令。
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