好吧,正如标题所暗示的,这更像是一个问题记录。我试图按照 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/

10-16 09:21