Keycloak 8:已添加用户名为“admin”的用户
Posted
技术标签:
【中文标题】Keycloak 8:已添加用户名为“admin”的用户【英文标题】:Keycloak 8: User with username 'admin' already added 【发布时间】:2020-04-23 06:14:30 【问题描述】:我无法使用 ansible 和 docker-compose 启动 keycloak 容器。我收到错误消息:用户名“admin”的用户已添加到“/opt/jboss/keycloak/standalone/configuration/keycloak-add-user.json”
我有 3 个可靠的工作:
创建网络:
- name: Create a internal network
docker_network:
name: internal
设置 postgres:
- name: "Install Postgres"
docker_compose:
project_name: posgressdb
restarted: true
pull: yes
definition:
version: '2'
services:
postgres:
image: postgres:12.1
container_name: postgres
restart: always
env_file:
- /etc/app/db.env
networks:
- internal
volumes:
- postgres-data:/var/lib/postgresql/data
- /etc/app/createdb.sh:/docker-entrypoint-initdb.d/init-app-db.sh
ports:
- "5432:5432"
volumes:
postgres-data:
networks:
internal:
external:
name: internal
创建密钥斗篷容器:
- name: Install keycloak
docker_compose:
project_name: appauth
restarted: true
pull: yes
definition:
version: '2'
services:
keycloak:
image: jboss/keycloak:8.0.1
container_name: keycloak
restart: always
environment:
- DB_VENDOR=POSTGRES
- DB_ADDR=postgres
- DB_PORT=5432
- DB_SCHEMA=public
- DB_DATABASE=keycloak
- DB_USER=keycloak
- DB_PASSWORD=keycloak
- KEYCLOAK_USER=admin
- KEYCLOAK_PASSWORD=admin
networks:
- internal
networks:
internal:
external:
name: internal
有人知道我为什么会收到这个错误吗?
编辑
如果我将 keycloak 降级到版本 7,它会正常启动!
【问题讨论】:
该用户可能在上一次运行时就在那里。清理 postgres-data 卷 = 从头开始 db。 @JanGaraj 不,不是。我在干净的环境中运行 ansible playbook 仍然得到同样的错误。 我遇到了同样的问题。删除所有 docker 容器和图像并重新下载它们以某种方式解决了它。 @cib 如果容器停止然后重新启动,它似乎会崩溃。创建了一个问题:issues.redhat.com/browse/KEYCLOAK-12896 【参考方案1】:只是为了澄清其他答案。我遇到过同样的问题。对我有帮助的是:
-
停止所有容器
注释掉两个相关的行
version: "3"
services:
keycloak:
image: quay.io/keycloak/keycloak:latest
environment:
# KEYCLOAK_USER: admin
# KEYCLOAK_PASSWORD: pass
...
启动所有容器;
等到 keycloak 容器成功启动 再次停止所有容器在上面的两行中评论
version: "3"
services:
keycloak:
image: quay.io/keycloak/keycloak:latest
environment:
KEYCLOAK_USER: admin
KEYCLOAK_PASSWORD: pass
...
启动所有容器
这一次(以及随后的几次)它奏效了。 Keycloak 正在运行,管理员用户已注册并按预期工作。
【讨论】:
这行得通,令人难以置信。可能是因为没有正确关闭容器。 @Madeo 听起来您可能不小心注释掉了所有变量?而不仅仅是两个......?【参考方案2】:当 Keycloak 在启动过程中被中断时会发生这种情况。在此之后,尝试添加管理员用户的命令开始失败。在 Keycloak 7 中这不是致命的,但在 8.0.1 中,这一行被添加到 /opt/jboss/tools/docker-entrypoint.sh
中,这会中止整个启动脚本:
set -eou pipefail
相关问题:https://issues.redhat.com/browse/KEYCLOAK-12896
【讨论】:
【参考方案3】:我遇到了同样的问题。在 docker-compose 中注释掉 KEYCLOAK_USER 环境变量并更新堆栈后,容器再次启动。
docker_compose:
project_name: appauth
restarted: true
pull: yes
definition:
version: '2'
services:
keycloak:
image: jboss/keycloak:8.0.1
container_name: keycloak
restart: always
environment:
- DB_VENDOR=POSTGRES
- DB_ADDR=postgres
- DB_PORT=5432
- DB_SCHEMA=public
- DB_DATABASE=keycloak
- DB_USER=keycloak
- DB_PASSWORD=keycloak
#- KEYCLOAK_USER=admin
#- KEYCLOAK_PASSWORD=admin
networks:
- internal
networks:
internal:
external:
name: internal
【讨论】:
【参考方案4】:注释掉KEYCLOAK_USER
作品的原因是它强制重新创建容器。也可以通过以下方式完成:
docker rm -f keycloak
docker compose up keycloak
【讨论】:
【参考方案5】:我使用 Keycloak 12,但在启动中断时仍会出现此问题。我可以看到删除文件“keycloak-add-user.json”并重新启动容器是可行的。
想法是将这个逻辑集成到容器启动中。我开发了一个简单的自定义入口点脚本。
#!/bin/bash
set -e
echo "executing the custom entry point script"
FILE=/opt/jboss/keycloak/standalone/configuration/keycloak-add-user.json
if [ -f "$FILE" ]; then
echo "keycloak-add-user.json exist, hence deleting it"
rm $FILE
fi
echo "executing the entry point script from original image"
source "/opt/jboss/tools/docker-entrypoint.sh"
并且我确保重建 keycloak 图像并适当地适应入口点 在初始部署期间在 Dockerfile 中。
ARG DEFAULT_IMAGE_BASEURL_APPS
FROM "$DEFAULT_IMAGE_BASEURL_APPS/jboss/keycloak:12.0.1"
COPY custom-entrypoint.sh /opt/jboss/tools/custom-entrypoint.sh
ENTRYPOINT [ "/opt/jboss/tools/custom-entrypoint.sh" ]
由于我们的部署是在本地进行的,因此与开发团队的联系并不容易。我们的一线支持人员所能做的就是尝试重新启动我们部署的服务器。因此产生了这种解决方法的想法。
【讨论】:
谢谢,我当前的安装没有数据库(是 keycloak 独立映像)。要恢复,我 1. 由docker commit my-keycloak-container
和docker tag <sha> keycloak-temp
创建一个新镜像; 2.从新镜像创建一个临时容器:docker run -it --entrypoint=sh keycloak-temp
; 3.将文件keycloak-add-user.json
重命名为keycloak-add-user.json.old
; 4. 创建一个新镜像 5. 使用--entrypoint=/opt/jboss/tools/docker-entrypoint.sh
运行一个新容器【参考方案6】:
根据我的发现,设置此默认用户的最佳方法是不通过环境变量添加它,而是通过以下命令:
docker exec <CONTAINER> /opt/jboss/keycloak/bin/add-user-keycloak.sh -u <USERNAME> -p <PASSWORD>
根据the official documentation。
【讨论】:
这是一个很好的信息。每个与 keycloak 相关的问题似乎都只针对 docker-compose。工作得很好 谢谢,简单的 docker 实例的完美答案【参考方案7】:我解决这个问题的方法是在容器文件系统中将 set -eou pipefail
替换为 # set -eou pipefail
。
在我的 docker 主机上以 root 身份登录,然后编辑此搜索返回的每个文件:
find /var/lib/docker/overlay2 | grep /opt/jboss/tools/docker-entrypoint.sh
【讨论】:
你拯救了我的一天【参考方案8】:我已经尝试了 Thomas 的解决方案,但它有时有效,有时无效。
问题是启动时 Keycloak 没有找到所需的数据库,因此它被Zmey 提到的中断。您是否尝试过在第二个 ansible 作业中添加 depends_on: - postgres
?
遇到同样的问题,但使用 docker-compose,我首先从 postgres 容器开始,以创建必要的 dbs(手动步骤)docker-compose up postgres
,然后我启动了整个设置 docker-compose up
。
【讨论】:
【参考方案9】:Thomas Solutions 很好,但重新启动所有容器并重新启动毫无价值,因为我的 docker-compose 文件有 7 个服务。
我分两步解决了这个问题。
-
首先我像其他人一样推荐这两行代码
#- KEYCLOAK_USER=admin #- KEYCLOAK_PASSWORD=admin
-
然后我在新终端运行这个命令,它就可以工作了。
docker-compose up keycloak
keycloak 是一个服务名称
【讨论】:
【参考方案10】:当我关闭 Portainer 中的 Keycloak 容器并尝试让它们重新启动并运行时,我就遇到了这种情况。
我可以通过在关闭容器(都在 Portainer 中)然后运行 docker-compose up
后“删除”容器来防止错误。确保不要删除任何附加到容器的卷,否则您可能会丢失数据。
【讨论】:
【参考方案11】:对于其他遇到此问题且之前的答案都没有帮助的用户,请检查您与数据库的连接,如果 keycloak 无法连接到数据库,通常会出现此错误。
使用 Docker 在 Keycloak 8 中进行测试。
【讨论】:
【参考方案12】:如果您想在服务器启动之前添加用户或希望它看起来像经典迁移,请使用传递的管理参数构建自定义映像
FROM quay.io/keycloak/keycloak:latest
ARG ADMIN_USERNAME
ARG ADMIN_PASSWORD
RUN /opt/jboss/keycloak/bin/add-user-keycloak.sh -u $ADMIN_USERNAME -p $ADMIN_PASSWORD
码头工人撰写:
auth_service:
build:
context: .
dockerfile: Dockerfile
args:
ADMIN_USERNAME: $KEYCLOAK_USERNAME
ADMIN_PASSWORD: $KEYCLOAK_PASSWORD
(请勿将 KEYCLOAK_USERNAME/KEYCLOAK_PASSWORD 添加到环境部分)
【讨论】:
【参考方案13】:我在 Docker 中运行 Keycloak "jboss/keycloak:11.0.3" 时遇到了这个问题,错误:
User with username 'admin' already added to '/opt/jboss/keycloak/standalone/configuration/keycloak-add-user.json
'
Adicional 信息,也在 Docker 中与 PostgreSQL v13.2 一起运行。我为其他资源创建了一些架构,但我没有为 Keycloak 创建架构,所以解决方案是针对我的情况,在 postgres 中运行 create schema 命令:
CREATE SCHEMA IF NOT EXISTS keycloak AUTHORIZATION postgres;
注意:希望这会有所帮助,这篇文章中分享的其他解决方案都没有解决我的问题。
【讨论】:
【参考方案14】:您还可以停止容器并简单地删除关联的卷。
如果您不知道您的 keycloak 容器是否关联了卷,请运行:
docker-compose down
for vol in $(docker volume ls --format .Name); do
docker volume rm $vol
done
【讨论】:
此脚本将删除所有 docker 卷,而不仅仅是 keycloak 容器的卷。以上是关于Keycloak 8:已添加用户名为“admin”的用户的主要内容,如果未能解决你的问题,请参考以下文章
使用 Keycloak Admin Java API 向用户添加角色
哪些角色允许 Keycloak 领域中的用户使用 Admin-REST-API?
Springboot Keycloak Admin添加角色或重置密码错误