まあ、タイトルが示唆するように、これは問題の記録の詳細です。私はこれの指示に従いました [〜#〜] 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.conf
のhosts
エントリは、コンテナ内では次のようになります。
hosts: files dns myhostname
dns
をpostgres.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
これで問題は発生しなくなりました。質問を締めくくります。