好吧,正如标题所暗示的,这更像是一个问题记录。我试图按照 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 文件显示它使用以下逻辑来确定要使用的数据库。
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
是什么,但显然它不是预期的 PostgreSQL 服务器,由 getent
解析。不确定这是否也是最近的 linux 问题。名称服务交换机配置文件 hosts
中的 /etc/nsswitch.conf
条目在容器内部如下所示。hosts: files dns myhostname
将
dns
解析为 postgres
的是 postgres.mbox.com
数据源。这就是为什么数据库供应商确定逻辑失败,最终导致容器无法启动的原因。自本文发布之日起,此 README 文件中的说明不起作用。
以下是使用 PostgreSQL 作为数据库在 docker 中正确启动 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
最佳答案
我遇到了同样的问题。事实证明,解决方案的关键是缺少参数“DB_USER=keycloak”。
应用程序尝试使用用户名 '' 对数据库进行身份验证。这由第一条错误消息指示。
WFLYCTL0113: '' is an invalid value for parameter user-name
可能 4.x 和 5.0.0 版本将默认用户名设置为“keycloak”,而在 6.0.0 中不再如此。
将参数 DB_USER=keycloak 添加到环境变量列表后,keycloak 启动没有任何问题。
关于postgresql - docker 中的 Keycloak 服务器无法以独立模式启动?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56180225/