泊坞窗中的Keycloak服务器无法以独立模式启动?

时间:2019-05-17 05:36:59

标签: postgresql docker keycloak

好吧,正如标题所示,这更多是问题记录。我试图按照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泊坞窗容器中执行以下命令,会发现一些有趣的事情。

[root@71961b81189c bin]# getent hosts postgres
69.172.201.153  postgres.mbox.com
[root@71961b81189c bin]# echo $?
0

不确定此postgres.mbox.com是什么,但是显然getent不能解决该PostgreSQL服务器。不确定这是否是最近的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

3 个答案:

答案 0 :(得分:4)

我遇到了同样的问题。事实证明,解决方案的关键是缺少参数“ 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顺利启动,没有任何问题。

答案 1 :(得分:1)

即使在7.0.0版中,我对此问题也有一个有趣的发现。就像作者提到的一样,如果主机可以解决,则选择postgres。

$ getent hosts postgres
$ 92.242.140.21

我注意到的是,如果我在任何奇怪的地方(甚至是foobar)发出ping命令,它的计算结果都是相同的IP地址。示例:

$ ping foobar
$ PING foobar (92.242.140.21): 56 data bytes 

看来,我的ISP将所有内容都发送到一个公共端空间。我已经通过使用-e DB_VENDOR = h2来选择h2 db,从而解决了问题,然后没有问题。另外,您始终可以提升自己的postgres版本,或指向合法的端点。 (不是您的ISP提供的用于DNS错误处理的伪造的东西)

答案 2 :(得分:0)

该问题现在不再发生。我正在投票结束问题。