Keycloak Docker 容器未连接到 MySQL 数据库

Posted

技术标签:

【中文标题】Keycloak Docker 容器未连接到 MySQL 数据库【英文标题】:Keycloak Docker container does not connect to MySQL database 【发布时间】:2022-01-07 21:46:10 【问题描述】:

我正在尝试在 Docker 容器内设置 Keycloak 服务器,我希望 它利用存储在主机上的 mysql 数据库,但我想要这个 由也在内部运行的 MySQL 实例管理的数据库 码头集装箱。但是,我无法让它工作。

到目前为止,我已经尝试了以下方法:

# Create network for keycloak
docker network create edci-network

# First start up MySQL server…
docker run \
    --name edci-keycloak-mysql \
    -d \
    --net edci-network \
    -e MYSQL_DATABASE=edci-keycloak \
    -e MYSQL_USER=edci-keycloak \
    -e MYSQL_PASSWORD=password \
    -v /path/to/local/database:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=root_password \
    mysql

# … then run Keycloak with token exchange enabled.
docker run \
    --name edci-keycloak \
    -d \
    -p 9000:8080 \
    --net edci-network \
    -e KEYCLOAK_USER=admin \
    -e KEYCLOAK_PASSWORD=admin \
    -e DB_ADDR=edci-keycloak-mysql \
    -e DB_PASSWORD=password \
    -e JAVA_OPTS_APPEND="
        -Dkeycloak.profile.feature.token_exchange=enabled
        -Dkeycloak.profile.feature.admin_fine_grained_authz=enabled
    " \
    quay.io/keycloak/keycloak:15.0.2

但是,Keycloak 日志声明

使用 H2 数据库

在服务器启动时。我在这里做错了什么? MySQL 示例 Keycloak Docker Hub 页面上的也无法正常工作。

请注意,使用 Docker Compose 不是一种选择,所以答案依赖于它 不考虑。感谢您的帮助。


Keycloak 容器日志:https://pastebin.com/b56cmxBJ。

【问题讨论】:

你的 docker run for keycloak;有-e DB_USER=edci-keycloak吗? @gohm'c 我也尝试了设置该环境变量,但没有帮助。 你需要那个 DB_USER,你能设置DB_ADDR=<your host primary IP> 看看它是否有效吗? “主机主IP”是指kubernetes.docker.internal吗? 【参考方案1】:

您没有使用预定义的值(例如 Keycloak 容器需要 DB 名称 keycloak),因此您需要明确配置所有 DB 详细信息(环境变量 DB_*):

# Create network for keycloak
docker network create edci-network

# First start up MySQL server…
docker run \
    --name edci-keycloak-mysql \
    -d \
    --net edci-network \
    -e MYSQL_DATABASE=edci-keycloak \
    -e MYSQL_USER=edci-keycloak \
    -e MYSQL_PASSWORD=password \
    -v /path/to/local/database:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=root_password \
    mysql

# … then run Keycloak with token exchange enabled.
docker run \
    --name edci-keycloak \
    -d \
    -p 9000:8080 \
    --net edci-network \
    -e KEYCLOAK_USER=admin \
    -e KEYCLOAK_PASSWORD=admin \
    -e DB_VENDOR=mysql \
    -e DB_ADDR=edci-keycloak-mysql \
    -e DB_DATABASE=edci-keycloak \
    -e DB_USER=edci-keycloak \
    -e DB_PASSWORD=password \
    -e JAVA_OPTS_APPEND="
        -Dkeycloak.profile.feature.token_exchange=enabled
        -Dkeycloak.profile.feature.admin_fine_grained_authz=enabled
    " \
    quay.io/keycloak/keycloak:15.0.2

【讨论】:

嗯。奇怪的是,Keycloak 服务器仍然拒绝启动,尽管“使用 H2 数据库”已替换为“使用 MySQL 数据库”。以下是最新日志:pastebin.com/yrYEMezD。主要原因似乎在第 234 行:“原因:java.sql.SQLException: Access denied for user 'edci-keycloak'@'172.18.0.3' (using password: YES)” 我想知道这是否是原因(来自 MySQL Docker Hub 页面):“如果您使用已经包含数据库(特别是 mysql 子目录)的数据目录启动 mysql 容器实例,则 $ MYSQL_ROOT_PASSWORD 变量应该从运行命令行中省略;在任何情况下都将被忽略,并且不会以任何方式更改预先存在的数据库。"。 是的,我认为这就是问题所在。最初创建的数据库也可能使用名称“keycloak”,这导致了冲突。

以上是关于Keycloak Docker 容器未连接到 MySQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Docker 容器未连接到本地 mysql

docker 容器中的 Keycloak + 主机上的 MySQL 提供 [org.keycloak.services] (ServerService 线程池 -- 62) 无法连接到数据库

keycloak 容器正在重新启动,但出现错误 docker-compose

docker镜像未连接到mongodb

Docker中的Spring Boot未连接到Docker中的Mongo

运行 docker compose up 时 Postgres db 未连接到 docker