web-dev-qa-db-ja.com

DockerのKeycloakサーバーがスタンドアロンモードで起動しない

まあ、タイトルが示唆するように、これは問題の記録の詳細です。私はこれの指示に従いました [〜#〜] 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 ファイルは、以下のロジックを使用して、使用するDBを決定することを示しています。

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.confhostsエントリは、コンテナ内では次のようになります。

hosts:      files dns myhostname

dnspostgres.mbox.comに解決したのはpostgresデータソースです。


このため、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
7
Ruifeng Ma

これで問題は発生しなくなりました。質問を締めくくります。

0
Ruifeng Ma