gpt4 book ai didi

postgresql - docker 中的 Keycloak 服务器无法以独立模式启动?

转载 作者:行者123 更新时间:2023-11-29 11:26:56 24 4
gpt4 key购买 nike

好吧,正如标题所暗示的,这更像是一个问题记录。我试图按照此 README 上的说明进行操作Keycloak docker 服务器镜像文件,但遇到了一些拦截器。

拉取镜像后,以下启动独立实例的命令失败。

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 是什么,但显然它不是要由 getent 解析的预期 PostgreSQL 服务器。也不确定这是否是最近的 Linux 问题。名称服务切换配置文件 /etc/nsswitch.conf 中的 hosts 条目在容器内如下所示。

hosts:      files dns myhostname

dns数据源将postgres解析为postgres.mbox.com


这就是为什么DB供应商判断逻辑失败,最终导致容器启动失败的原因。截至本文发布之日,此 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com