所以我正在尝试使用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何时完成初始化数据库- 这意味着当它无法访问MySQL数据库时,它将继续并抛出异常,因为数据库仍将启动。depends_on
在这里是不够的,因为它不会等到服务ready
,在这里解释得很好
我使用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
这是所提出的问题。如果数据库是可访问的,它实际上会利用它。当我解决我的网络问题时,我将对此答案进行编辑以使其保持最新。
旁注
值得注意的是,Keycloak3.4.3
(此处使用(在版本5.1
中使用 mysql 驱动程序,这需要与版本5.6
、5.7
及更高版本MySQL server
。