连接Keycloak和Postgres数据库

hs2*_*s27 5 postgresql docker keycloak quarkus

我正在尝试使用 Docker 将 Keycloak (20.0.3) 与 Postgres 数据库连接。这些是我配置它所采取的步骤:

1. docker network create keycloak-network
2. docker run --name postgresP -p 5432:5432 -d --net keycloak-network -e POSTGRES_PASSWORD=admin -e POSTGRES_USER=admin -e POSTGRES_DB=pdb -d postgres:latest
3. docker run -p 9090:9090 --name keycloakP --net keycloak-network -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin -e KC_DB=postgres -e KC_DB_URL=jdbc:postgresql://localhost:5432/pdb -e KC_DB_USERNAME=admin -e KC_DB_PASSWORD=admin quay.io/keycloak/keycloak:latest start-dev
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误。我尝试进行故障排除,但不幸的是 Keycloak 的文档不是那么好。任何线索都将受到高度赞赏。提前致谢。

2023-02-10 11:08:36,986 DEBUG [io.quarkus.bootstrap.classloading.QuarkusClassLoader] (main) Adding elements io.quarkus.bootstrap.classloading.PathTreeClassPathElement[io.quarkus:quarkus-devservices-common / runtime=false resources=null] to QuarkusClassLoader Augmentation Class Loader: PROD

2023-02-10 11:08:36,987 DEBUG [io.quarkus.bootstrap.classloading.QuarkusClassLoader] (main) Adding elements io.quarkus.bootstrap.classloading.PathTreeClassPathElement[io.quarkiverse.vault:quarkus-vault-deployment / runtime=false resources=null] to QuarkusClassLoader Augmentation Class Loader: PROD

2023-02-10 11:08:36,987 DEBUG [io.quarkus.bootstrap.classloading.QuarkusClassLoader] (main) Adding elements io.quarkus.bootstrap.classloading.PathTreeClassPathElement[org.keycloak:keycloak-quarkus-server-deployment / runtime=false resources=null] to QuarkusClassLoader Augmentation Class Loader: PROD

2023-02-10 11:08:39,257 DEBUG [io.quarkus.bootstrap.classloading.QuarkusClassLoader] (main) Adding elements io.quarkus.bootstrap.classloading.PathTreeClassPathElement[/ runtime=true resources=null] to QuarkusClassLoader Deployment Class Loader: PROD

2023-02-10 11:08:39,290 DEBUG [io.quarkus.deployment.QuarkusAugmentor] (main) Beginning Quarkus augmentation

2023-02-10 11:08:40,193 TRACE [io.quarkus.bootstrap.classloading.QuarkusClassLoader] (main) Class quarkus.properties not found in parent first load from java.net.URLClassLoader@192c3f1e

2023-02-10 11:08:40,194 TRACE [io.quarkus.bootstrap.classloading.QuarkusClassLoader] (main) Class quarkus.properties not found in parent first load from java.net.URLClassLoader@192c3f1e

ERROR: Failed to run 'build' command.
ERROR: No value present
Run Code Online (Sandbox Code Playgroud)

我想要实现的目标是使用 Keycloak 的自定义数据库而不是 H2,然后通过相同的方式创建持久用户/配置。

lar*_*sks 18

您的KC_DB_URL设置不正确;Postgres 没有运行localhost(这意味着“在 keycloak 容器中”);它在您的postgresP容器中运行,因此您需要使用该容器名称作为主机名:

KC_DB_URL=jdbc:postgresql://postgresP:5432/pdb
Run Code Online (Sandbox Code Playgroud)

这不会产生有效的配置,因为当您启动 Keycloak 容器时,您正在设置-p 9090:9090,但 Keycloak 正在侦听容器内的端口 8080,因此您需要-p 9090:8080.

您不需要-p 5432:5432在 postgres 容器上发布端口 ( ) 即可从 keycloak 容器访问它;仅当您想从主机或网络上的其他位置访问数据库时才需要端口发布。


一些与问题无关的评论:

  1. 当你意外地得到一个新的 Postgres 主要版本时,使用postgres:latest你的镜像会在某个时候引起问题;:latest请改用显式版本(例如postgres:15)。

    对于大多数图像来说也是如此——固定到特定版本(或至少是特定的主要版本)几乎总是一个好主意。

  2. 帮自己一个忙,使用它docker compose而不是手动运行一堆docker run命令。您当前的配置可以用以下形式表示docker-compose.yaml

    services:
      postgres:
        image: postgres:15
        environment:
          POSTGRES_PASSWORD: admin
          POSTGRES_USER: admin
          POSTGRES_DB: pdb
      keycloak:
        image: quay.io/keycloak/keycloak:20.0
        environment:
          KEYCLOAK_ADMIN: admin
          KEYCLOAK_ADMIN_PASSWORD: admin
          KC_DB: postgres
          KC_DB_URL: jdbc:postgresql://postgres/pdb
          KC_DB_USERNAME: admin
          KC_DB_PASSWORD: admin
        ports:
          - 9090:8080
        command:
          - start-dev
    
    Run Code Online (Sandbox Code Playgroud)

    将以上内容放入docker-compose.yaml然后运行docker compose up

    您会注意到,根据我之前的评论,我在此示例中没有发布 postgres 端口。

  3. 无论您是使用命令行docker compose还是仅使用多个docker run命令行,您可能都希望为 postgres 数据使用 Docker 卷,以便在重新启动容器时不会丢失所有内容。

    我没有在我的示例中进行配置,但您可以在官方文档以及本网站的各个地方找到适当的示例。