Keycloak生产环境无法获取JDBC连接问题求助(Docker Compose配置)
问题排查与修复方案
1. 清理重复的环境变量
你的Keycloak配置里KC_DB_URL重复定义了两次,直接删除其中一行即可,避免配置冲突:
- KC_DB_URL=jdbc:postgresql://qg_cms-db/keycloak
2. 自动创建Keycloak所需的PostgreSQL数据库
当前Postgres容器默认只会创建与POSTGRES_USER同名的postgres数据库,Keycloak要连接的keycloak数据库不存在。在qg_cms-db的环境变量中添加以下配置,容器启动时会自动创建目标数据库:
- POSTGRES_DB=keycloak
3. 明确指定JDBC URL的端口(推荐)
虽然PostgreSQL默认端口为5432,但明确指定端口可以避免潜在的端口映射问题,修改KC_DB_URL为:
- KC_DB_URL=jdbc:postgresql://qg_cms-db:5432/keycloak
4. 让Keycloak等待Postgres完全就绪
depends_on仅保证启动顺序,不会等待Postgres完成初始化。修改Keycloak的depends_on配置,依赖Postgres的健康检查状态:
depends_on: qg_cms-db: condition: service_healthy
这样Keycloak会等到Postgres的健康检查通过后再启动,避免连接时数据库未就绪的问题。
修复后的完整配置示例
qg_cms-db: container_name: qg_cms-db image: postgres:16-alpine networks: - qg_cms-network environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - POSTGRES_DB=keycloak - PGPORT=5432 ports: - 5432:5432 volumes: - ./containers/data/postgres:/data/db - ./init-scripts:/docker-entrypoint-initdb.d healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 5 keycloak: image: quay.io/keycloak/keycloak:25.0.4 command: - start - --optimized environment: - KEYCLOAK_ADMIN=admin - KEYCLOAK_ADMIN_PASSWORD=verysecretpwd - KC_HOSTNAME_URL=https://myhost/ - KC_HOSTNAME_ADMIN_URL=https://myhost/ - KEYCLOAK_IMPORT=/opt/keycloak/data/import/realm.json - KC_PROXY=edge - PROXY_ADDRESS_FORWARDING=true - LOG_LEVEL=ALL - KC_DB=postgres - KC_DB_URL=jdbc:postgresql://qg_cms-db:5432/keycloak - KC_DB_USERNAME=postgres - KC_DB_PASSWORD=postgres - KC_LOG_LEVEL=DEBUG - KC_HOSTNAME_STRICT=false ports: - 8080:8080 - 8443:8443 depends_on: qg_cms-db: condition: service_healthy networks: - qg_cms-network
额外检查项
- 确认
init-scripts目录下的初始化脚本不会删除或修改keycloak数据库; - 检查两个容器是否处于同一
qg_cms-network网络(默认Docker Compose会自动创建该网络)。
内容的提问来源于stack exchange,提问作者joe Abou Nakoul
相关产品推荐
相关产品推荐

