使用 Docker Compose 时,Keycloak 不会在 PostgreSQL 中创建表

问题描述 投票:0回答:1

我正在尝试使用 Docker Compose 通过 PostgreSQL 设置 Keycloak,但表并未在 PostgreSQL 中创建,即使 Keycloak 应用程序本身运行没有任何问题。

尽管应用程序正确启动并且可以访问管理控制台,但当我检查 PostgreSQL 数据库时,我没有看到创建任何表(例如 REALM、USER_ENTITY 等)。

当我在 Docker 外部运行 Keycloak 时,通过使用 Keycloak 安装文件中的 kc.bat,可以在 PostgreSQL 数据库中成功创建表。 尽管没有记录表明失败的重大错误,但 Docker 似乎在某种程度上影响了表创建过程。

我尝试了所有我能想到的组合:使用自定义 Dockerfile、不使用 Dockerfile、更改 Keycloak 和 PostgreSQL 的版本以及调整环境变量。我进行了广泛的研究,应用了类似案例中提出的几种解决方案,甚至尝试使用 kc.bat 在 Docker 外部运行 Keycloak,这成功地创建了表。然而,在 Docker 中,尽管日志中没有错误,但没有出现任何表格,我不知道如何解决这个问题。 谁能帮我弄清楚为什么这些表不是用 Docker 创建的?谢谢你

这是我正在使用的设置:

Dockerfile:

FROM quay.io/keycloak/keycloak:25.0.6 as builder

ENV KEYCLOAK_ADMIN=admin
ENV KEYCLOAK_ADMIN_PASSWORD=admin

ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true

# Construisez la configuration de Keycloak

RUN /opt/keycloak/bin/kc.sh build

ENV KC_DB=postgres
WORKDIR /opt/keycloak

# for demonstration purposes only, please make sure to use proper certificates in production instead

RUN keytool -genkeypair -storepass password -storetype PKCS12 -keyalg RSA -keysize 2048 -dname "CN=server" -alias server -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -keystore conf/server.keystore
RUN /opt/keycloak/bin/kc.sh build

# Étape finale pour démarrer Keycloak

FROM quay.io/keycloak/keycloak:25.0.6

# Copier les fichiers de la phase de construction

COPY --from=builder /opt/keycloak/ /opt/keycloak/

# Définir les variables d'environnement pour la base de données et Keycloak

ENV KC_DB=postgres
ENV KC_DB_URL=jdbc:postgresql://postgres/keycloak
ENV KC_DB_USERNAME=newkeycloakuser
ENV KC_DB_PASSWORD=password
ENV KC_HOSTNAME=localhost
ENV KC_DB_SCHEMA=public

# Utiliser "start-dev" pour rester en mode développement

ENTRYPOINT \["/opt/keycloak/bin/kc.sh", "start-dev"\]

docker-compose.yml:

services:
  postgres:
    image: postgres:15
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: keycloak
      POSTGRES_USER: newkeycloakuser
      POSTGRES_PASSWORD: 623006
    networks:
      - keycloak_network

  keycloak:
    build: .
    environment:
      KC_DB: postgres
      KC_DB_URL: jdbc:postgresql://postgres/keycloak
      KC_DB_USERNAME: newkeycloakuser
      KC_DB_PASSWORD: password
      KC_HOSTNAME: localhost
      KC_DB_SCHEMA: public
      KEYCLOAK_ADMIN: admin   # Ajout de KEYCLOAK_ADMIN
      KEYCLOAK_ADMIN_PASSWORD: admin  # Ajout de KEYCLOAK_ADMIN_PASSWORD
    ports:
      - 8080:8080
    restart: always
    depends_on:
      - postgres
    networks:
      - keycloak_network

volumes:
  postgres_data:
    driver: local

networks:
  keycloak_network:
    driver: bridge

日志:

2024-10-02 18:43:08.314 UTC [68] ERROR:  relation "migration_model" does not exist at character 25
2024-10-02 18:43:08.314 UTC [68] STATEMENT:  SELECT ID, VERSION FROM MIGRATION_MODEL ORDER BY UPDATE_TIME DESC
2024-10-02 18:43:09.270 UTC [68] ERROR:  relation "public.databasechangelog" does not exist at character 22
2024-10-02 18:43:09.270 UTC [68] STATEMENT:  SELECT COUNT(*) FROM public.databasechangelog
2024-10-02 18:43:09.597 UTC [69] ERROR:  relation "public.databasechangeloglock" does not exist at character 22
2024-10-02 18:43:09.597 UTC [69] STATEMENT:  SELECT COUNT(*) FROM public.databasechangeloglock
database postgresql docker docker-compose keycloak
1个回答
0
投票

您使用什么命令来检查数据库中是否创建了与keycloak相关的表?您分享的日志并不意味着表未创建。根据我的经验,如果表不存在,keycloak 在运行此类查询后会创建表。

在你的keycloak数据库中,你可以运行

\dt
并分享结果吗?

© www.soinside.com 2019 - 2024. All rights reserved.