You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地部署Keycloak时Docker容器PostgreSQL角色认证错误求助

Keycloak连接Docker PostgreSQL容器失败:用户"postgres"不存在/密码验证失败

我通过命令sudo docker-compose -f file_name.yaml up --build启动本地Keycloak服务器,使用的docker-compose配置如下:

version: "3.9"
services:
  keycloak-postgres:
    image: library/postgres:${KC_POSTGRES_IMAGE_TAG:-14}
    container_name: ${POSTGRES_CONTAINER_NAME:-postgres}
    restart: on-failure
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
    healthcheck:
      test: pg_isready -d postgres
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 5s
    ports:
      - ${KC_POSTGRES_PORT_MAPPING:-5435}:5432
    deploy:
      resources:
        limits:
          memory: 256M

  keycloak:
    image: quay.io/keycloak/keycloak:20.0.2
    container_name: keycloak
    command:
      - start --auto-build --db postgres --hostname-strict-https false --hostname-strict false --proxy edge --http-enabled true --import-realm --spi-user-profile-legacy-user-profile-read-only-attributes *_RES_ACCESS_MODE
    environment:
      KC_DB_URL: jdbc:postgresql://keycloak-postgres:5432/postgres
      KC_DB_USERNAME: postgres
      KC_DB_PASSWORD: postgres
      KC_DB_SCHEMA: public
      KC_FEATURES: preview
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: admin
    volumes:
      - type: bind
        source: ./realm-export.json
        target: /opt/keycloak/data/import/realm-export.json
        read_only: true
    ports:
      - 8282:8080
    depends_on:
      keycloak-postgres:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "curl", "-f", "http://0.0.0.0:8080/realms/master"]
      start_period: 10s
      interval: 30s
      retries: 3
      timeout: 5s

启动过程中出现错误,关键日志如下:

postgres  | 2024-04-11 21:54:28.799 UTC [1] LOG:  database system is ready to accept connections
postgres  | 2024-04-11 21:54:38.880 UTC [42] FATAL:  role "root" does not exist
...
recovery is not enabled. Please enable transaction recovery by setting quarkus.transaction-manager.enable-recovery=true, otherwise data may be lost if the application is terminated abruptly
postgres  | 2024-04-11 21:54:43.032 UTC [43] FATAL:  password authentication failed for user "postgres"
postgres  | 2024-04-11 21:54:43.032 UTC [43] DETAIL:  Role "postgres" does not exist.
postgres  |     Connection matched pg_hba.conf line 100: "host all all all scram-sha-256"
keycloak  | 2024-04-11 21:54:43,035 WARN  [io.agroal.pool] (agroal-11) Datasource '<default>': FATAL: password authentication failed for user "postgres"

我已检查宿主机本地PostgreSQL的角色列表,确认postgres角色存在:

mypc=# \du
                                     List of roles
  Role name   |                         Attributes                         | Member of 
--------------+------------------------------------------------------------+-----------
 mypc | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 postgres     | Superuser                                                  | {}
 root         | Superuser                                                  | {}

同时执行了修改密码的操作:

ALTER USER postgres WITH PASSWORD 'postgres';

但问题仍未解决,请求帮助。


解决方案

1. 清理Docker PostgreSQL容器的持久化数据

你检查的是宿主机的PostgreSQL,而docker-compose中使用的是独立的PostgreSQL容器,两者完全隔离。容器内的PostgreSQL可能因旧数据卷残留导致初始化异常,执行以下命令清理后重新启动:

# 停止并移除容器
sudo docker-compose -f file_name.yaml down
# 删除PostgreSQL相关数据卷(会清除容器内所有数据,谨慎操作)
sudo docker volume rm $(sudo docker volume ls -q | grep -E 'postgres|keycloak-postgres')
# 重新构建并启动容器
sudo docker-compose -f file_name.yaml up --build

2. 修正PostgreSQL健康检查命令

当前健康检查未指定用户,默认使用root连接导致报错,修改健康检查配置:

healthcheck:
  test: pg_isready -U postgres -d postgres
  interval: 10s
  timeout: 5s
  retries: 3
  start_period: 5s

3. 验证环境变量未被覆盖

检查是否有环境变量覆盖了容器的初始化配置:

echo $KC_POSTGRES_IMAGE_TAG $POSTGRES_CONTAINER_NAME $KC_POSTGRES_PORT_MAPPING

若输出非空,确认这些值不会导致容器初始化异常,例如POSTGRES_CONTAINER_NAME是否与其他容器冲突。

4. 确认容器网络连通性

docker-compose默认会为服务创建专属网络,Keycloak容器通过服务名keycloak-postgres访问PostgreSQL容器,可进入Keycloak容器测试连通性:

# 进入Keycloak容器
sudo docker exec -it keycloak /bin/bash
# 安装ping工具(若未安装)
microdnf install iputils
# 测试PostgreSQL容器连通性
ping keycloak-postgres

内容的提问来源于stack exchange,提问作者mascai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 22:31:02