Keycloak Docker容器无法连接到MySQL数据库。

3
我正在尝试在Docker容器中设置Keycloak服务器,并希望它利用存储在主机上的MySQL数据库,但我希望这个数据库由一个也在Docker容器中运行的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数据库。我做错了什么? Keycloak Docker Hub页面上的MySQL示例也不能正常工作。请注意,使用Docker Compose不是一个选项,因此依赖它的答案将不被考虑。感谢您的任何帮助。
Keycloak容器日志:https://pastebin.com/b56cmxBJ

你的Keycloak的Docker运行命令中,是否有-e DB_USER=edci-keycloak这个参数? - gohm'c
@gohm'c 我也尝试设置了那个环境变量,但是没有帮助。 - SeSodesa
你需要那个DB_USER,能否设置DB_ADDR=<你的主机IP地址>,然后看看它是否起作用? - gohm'c
“主机主要IP”是指像kubernetes.docker.internal这样的东西吗? - SeSodesa
1个回答

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接