我正在尝试使用 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
您使用什么命令来检查数据库中是否创建了与keycloak相关的表?您分享的日志并不意味着表未创建。根据我的经验,如果表不存在,keycloak 在运行此类查询后会创建表。
在你的keycloak数据库中,你可以运行
\dt
并分享结果吗?