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-containerdocker 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中新添加的领域管理员无法登录领域

哪些角色允许 Keycloak 领域中的用户使用 Admin-REST-API?

Springboot Keycloak Admin添加角色或重置密码错误

Keycloak:使用 keycloak-admin 为用户生成访问令牌

Keycloak:Admin-cli 添加 SMTP 服务器详细信息?