Keyrock容器无法识别默认超级管理员用户问题求助
Keyrock Docker部署认证失败问题排查
一、管理员环境变量的作用
你配置的IDM_ADMIN_USER、IDM_ADMIN_EMAIL、IDM_ADMIN_PASS确实是Keyrock用来初始化默认超级管理员账号的环境变量——容器首次启动时,会根据这些参数在数据库中创建管理员账号(仅当账号不存在时执行)。
二、认证失败的核心原因及修复方案
1. 请求方法错误(最可能的原因)
Keyrock的/v1/auth/tokens接口要求使用POST方法发起请求,但你当前使用的是GET方法,这直接导致认证逻辑不触发,返回401。
修复后的正确请求:
### 获取Keyrock的X-Auth-Token POST http://localhost:3005/v1/auth/tokens Content-Type: application/json {"email":"admin@test.com","password":"1234"}
2. 数据库持久化导致账号未更新
你使用了mysqlVolume持久化卷,如果之前启动过Keyrock容器,数据库中已经存在旧的管理员账号,后续启动时新的环境变量不会覆盖已有账号(即使密码或邮箱不一致)。
修复方案:
- 彻底重置数据库:执行
docker-compose down -v删除卷,再重新启动容器,让Keyrock重新初始化管理员账号。 - 手动修改数据库密码:
- 进入MySQL容器:
docker exec -it <你的mysql容器名称> mysql -uroot -pidm - 切换到idm库:
use idm; - 更新密码:
UPDATE user SET password = SHA2('1234', 256) WHERE email = 'admin@test.com'; - 刷新权限:
FLUSH PRIVILEGES;
- 进入MySQL容器:
3. Keyrock端口配置错误
你的docker-compose中,Keyrock容器内部服务端口是3000,但IDM_PORT设置为3005(宿主机映射端口),这会导致Keyrock内部逻辑出现异常。
修复:将IDM_PORT修改为容器内部端口3000:
environment: - IDM_DB_HOST=mysql - IDM_HOST=http://localhost:3005 - IDM_PORT=3000 # 此处改为3000 - IDM_DB_USER=root - IDM_ADMIN_USER=admin - IDM_ADMIN_EMAIL=admin@test.com - IDM_ADMIN_PASS=1234
4. MySQL未就绪时Keyrock提前启动
虽然配置了depends_on,但MySQL可能还未完成初始化,Keyrock就启动了,导致管理员账号未成功创建。
修复:给MySQL添加健康检查,确保其就绪后再启动Keyrock:
services: mysql: # ... 其他配置不变 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-pidm"] interval: 5s timeout: 5s retries: 5 keyrock: # ... 其他配置不变 depends_on: mysql: condition: service_healthy
内容的提问来源于stack exchange,提问作者Νικόλας Καστρινάκης
相关产品推荐
相关产品推荐

