Keycloak 容器中 kcadm.sh 无法创建配置文件怎么办?
数据阿明
结论
问题在于 kcadm.sh 保存 CLI 凭据配置时使用的路径和目录权限。日志显示,它尝试写入 /.keycloak/kcadm.config。Dockerfile 中创建目录并将权限设为 755,并不意味着容器进程可以在该目录中创建文件:只有目录所有者有写权限,其他用户只能读取和进入目录。
KC_ADMIN_CONFIG 并不是这段脚本中 kcadm.sh 识别的配置路径设置。即使设置了它,报错仍指向 /.keycloak/kcadm.config。由于登录凭据没有保存成功,后续查询和创建客户端的命令无法从配置中读取服务器信息,因此报出 No server specified。
让配置写入可写目录
可以将 HOME 指向容器进程有写权限的位置,并在调用 kcadm.sh 前创建默认配置目录。下面的示例使用 /tmp:
export HOME=/tmp
mkdir -p "$HOME/.keycloak"
/opt/keycloak/bin/kcadm.sh config credentials \
--server http://localhost:8080 \
--realm master \
--user "$KEYCLOAK_ADMIN" \
--password "$KEYCLOAK_ADMIN_PASSWORD"
同一脚本中的后续 kcadm.sh 命令也要使用相同的 HOME 环境,这样才能从该用户的配置位置读取凭据。可以移除 KC_ADMIN_CONFIG 设置,以免误以为它是实际生效的配置路径。
如果不想使用 /tmp,也可以把 HOME 设为容器进程确实有写权限的目录,并在其中创建 .keycloak。请确认脚本运行用户对配置目录有写权限。
检查错误处理
当前脚本在认证失败后仍会继续执行,因此日志随后出现 No server specified,并继续尝试创建客户端。认证后检查命令是否成功,可以避免将后续错误误认为独立问题:
if ! /opt/keycloak/bin/kcadm.sh config credentials \
--server http://localhost:8080 \
--realm master \
--user "$KEYCLOAK_ADMIN" \
--password "$KEYCLOAK_ADMIN_PASSWORD"; then
echo "kcadm.sh credentials 配置失败" >&2
exit 1
fi
修复后,先确认认证命令不再报告 Failed to create config file,再执行查询客户端的命令。如果认证仍然失败,请检查进程实际使用的 HOME、配置目录的所有者和写权限,以及容器是否以预期用户运行。
备注:内容仅供参考。
