Keycloak + mysql on docker 撰写。没有数据保存

Keycloak + mysql on docker compose. No data saved

因此,我正在尝试使用 docker compose 设置一个带有 Mysql 后端的 Keycloak,但无论我做什么,Keycloak 都拒绝实际创建任何表或将任何数据存储在数据库,即使它们都启动得很好。
如果有人知道我做错了什么,我将永远感激不已。

version: '2'
services:
        lab-mysql:
                container_name: lab-mysql
                restart: always
                image: mysql/mysql-server:5.7
                environment:
                        MYSQL_ROOT_PASSWORD: password
                        MYSQL_ROOT_HOST: "%"
                        MYSQL_DATABASE: keycloak
                        MYSQL_USER: keycloak
                        MYSQL_PASSWORD: password
                volumes:
                        - ./lab-mysql:/var/lib/mysql
                ports:
                        - 3306:3306
        keycloak:
                container_name: lab-keycloak
                restart: always
                image: jboss/keycloak:3.4.3.Final
                depends_on:
                        - lab-mysql
                environment:
                        DB_VENDOR: mysql
                        DB_ADDR: lab-mysql
                        DB_PORT: 3306
                        DB_DATABASE: keycloak
                        DB_USER: keycloak
                        DB_PASSWORD: password
                        KEYCLOAK_USER: admin
                        KEYCLOAK_PASSWORD: password
                ports:
                        - 8080:8080
                        - 8443:8443
                        - 9990:9990
                volumes:
                        - ./lab-keycloak:/data
                links:
                        - lab-mysql

为了让您的 Keycloak 尝试使用您的 MySQL 数据库而不使用它自己的嵌入式数据库(参考我的评论),您应该更改一个变量:

DB_VENDOR: mysql

进入

DB_VENDOR: MYSQL

附加信息和提示

此外,这些服务启动过程应该分开(两个 docker-compose 文件或一个服务等待另一个),因为 Keycloak 不知道您的 MySQL 何时完成初始化DB - 这意味着它将继续并在无法访问 MySQL 数据库时抛出异常,因为数据库仍将启动。 depends_on 在这里是不够的,因为它没有等到服务是 ready,很好解释 here

我用的mysql-compose.yml

version: '2'
services:
        lab-mysql:
                image: mysql/mysql-server:5.7
                environment:
                        MYSQL_ROOT_PASSWORD: keycloak
                        MYSQL_ROOT_HOST: "%"
                        MYSQL_DATABASE: keycloak
                        MYSQL_USER: keycloak
                        MYSQL_PASSWORD: keycloak
                ports:
                        - 3306:3306

我用的keycloak-compose.yml

version: '2'
services:
        keycloak:
                image: jboss/keycloak:3.4.3.Final
                environment:
                        DB_VENDOR: MYSQL
                        DB_ADDR: 10.28.0.35
                        DB_PORT: 3306
                        DB_DATABASE: keycloak
                        DB_USER: keycloak
                        DB_PASSWORD: keycloak
                        KEYCLOAK_USER: admin
                        KEYCLOAK_PASSWORD: password
                ports:
                        - 8070:8080
                        - 8443:8443
                        - 9990:9990

请注意 DB_VENDOR 的更改,这在这里很重要,因为现在它实际上更改为使用 MySQL。还要注意 DB_ADDR 变量,以便将其更改为数据库为 运行 的地址。

非常重要的信息

我没能成功 运行 因为网络问题我还在解决,导致 keycloak 无法通过网络访问 mysql 服务.尽管 OP 可能会发现它非常有用,因为此更改会将连接从 embedded H2 更改为 external MySQL,这是被问到的问题。 如果数据库可访问,它会实际使用它。当我解决我的网络问题以使其保持最新时,我将对此答案进行编辑。

旁注

值得注意的是,Keycloak 3.4.3(此处使用)使用 5.1 版本的 mysql 驱动程序,需要 MySQL server 版本 5.65.7 及以上。