docker 中的 Keycloak 服务器无法以独立模式启动?
Keycloak server in docker fails to start in standalone mode?
好吧,正如标题所暗示的,这更像是一个问题记录。我试图按照 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
是什么,但显然它不是要由 getent
解析的预期 PostgreSQL 服务器。也不确定这是否是最近的 linux 问题。名称服务切换配置文件 /etc/nsswitch.conf
中的 hosts
条目在容器内如下所示。
hosts: files dns myhostname
是 dns
数据源将 postgres
解析为 postgres.mbox.com
。
这就是为什么数据库供应商判断逻辑失败,最终导致容器无法启动的原因。自此 post 发布之日起,此 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 启动没有任何问题。
我对这个问题也有一个有趣的观察,即使是在 7.0.0 版本中。就像作者提到的那样,如果主机可以解析,postgres selected。
$ getent hosts postgres
$ 92.242.140.21
我注意到,如果我在任何奇怪的地方发出 ping 命令,甚至是 foobar,它都会计算出相同的 IP 地址。示例:
$ ping foobar
$ PING foobar (92.242.140.21): 56 data bytes
我的 ISP 似乎将所有内容发送到一个公共端空间。我已经通过使用 -e DB_VENDOR=h2, to select h2 db 解决了这个问题,然后没有任何问题。或者,您始终可以启动自己的 postgres 版本,或指向合法端点。 (不是您的 ISP 提供的用于 DNS 错误处理的虚假内容)
好吧,正如标题所暗示的,这更像是一个问题记录。我试图按照 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
是什么,但显然它不是要由 getent
解析的预期 PostgreSQL 服务器。也不确定这是否是最近的 linux 问题。名称服务切换配置文件 /etc/nsswitch.conf
中的 hosts
条目在容器内如下所示。
hosts: files dns myhostname
是 dns
数据源将 postgres
解析为 postgres.mbox.com
。
这就是为什么数据库供应商判断逻辑失败,最终导致容器无法启动的原因。自此 post 发布之日起,此 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 启动没有任何问题。
我对这个问题也有一个有趣的观察,即使是在 7.0.0 版本中。就像作者提到的那样,如果主机可以解析,postgres selected。
$ getent hosts postgres
$ 92.242.140.21
我注意到,如果我在任何奇怪的地方发出 ping 命令,甚至是 foobar,它都会计算出相同的 IP 地址。示例:
$ ping foobar
$ PING foobar (92.242.140.21): 56 data bytes
我的 ISP 似乎将所有内容发送到一个公共端空间。我已经通过使用 -e DB_VENDOR=h2, to select h2 db 解决了这个问题,然后没有任何问题。或者,您始终可以启动自己的 postgres 版本,或指向合法端点。 (不是您的 ISP 提供的用于 DNS 错误处理的虚假内容)