keycloak异常关闭报错username ‘admin‘ already added时卡死无法重启的问题处理

news2024/9/30 15:27:57

问题现象

  • 使用docker部署keycloak服务,使用docker-compose进行配置管理,配置如下:
  keycloak:
    image: jboss/keycloak:16.1.0 
    container_name: keycloak
    command:
      [
        '-b',
        '0.0.0.0',
        '-Dkeycloak.migration.action=import',
        '-Dkeycloak.migration.provider=dir',
        '-Dkeycloak.migration.dir=/opt/jboss/keycloak/realm-config',
        '-Dkeycloak.migration.strategy=IGNORE_EXISTING',
        '-Djboss.socket.binding.port-offset=1000',
        '-Dkeycloak.profile.feature.upload_scripts=enabled',
      ]
    volumes:
      - /etc/localtime:/etc/localtime
    depends_on:
      - postgresql
    environment:
      - KEYCLOAK_USER=admin
      - KEYCLOAK_PASSWORD=admin
      - DB_VENDOR=postgres
      - DB_ADDR=postgresql:5432
      - DB_DATABASE=keycloak
      - DB_USER=postgres
      - DB_PASSWORD=xxxxxxx
      - TZ=Asia/Shanghai
    ports:
      - 9080:9080
    restart: always

  • 使用docker-compose up -d创建容器启动,是没有问题的,启动成功后可以使用 ip:9080端口访问,启动成功会出现如下日志
    在这里插入图片描述
  • 如果keycloak服务,在容器启动过程中(启动到一半)异常关闭,就会卡死无法启动,后续使用docker restart keycloak也没用,会一直卡死在这一行User with username 'admin' already added to '/opt/jboss/keycloak/standalone/configuration/keycloak-add-user.json'
  • 使用docker exec -it keycloak /bin/bash进入容器,找到这个位置/opt/jboss/keycloak/standalone/configuration/,也没看到这个文件
    在这里插入图片描述
  • 搜索网上的解决方案(包括Stack Overflow相关问题里的最高赞回答),大多数都是:停止容器,删除容器,重新创建重启启动
  • 删除容器重建确实能解决问题,但是这样很不优雅。而且如果keycloak没有使用数据库,数据还有丢失

分析和解决

  • 这个问题官方其实有问题帖: Related issue,可能因为网络问题打不开,继续看我的文章就行
  • 贴下Stack Overflow原贴,解决方案主要来源于这个帖子:keycloak-8-user-with-username-admin-already-added
  • 继续看里面的回复,看到一个用户Zmey回复This happens when Keycloak is interrupted during boot. After this, command which attempts to add admin user starts to fail. In Keycloak 7 this wasn't fatal, but in 8.0.1 this line was added to /opt/jboss/tools/docker-entrypoint.sh which aborts the entire startup script:,渣翻下为如下

这个问题发生在Keycloak启动过程中被中断的情况下。在此之后,试图添加管理员用户的命令将开始失败。在Keycloak 7中,这并不致命,但在8.0.1中,将此行添加到/opt/jboss/tools/docker-entrypoint.sh中会使整个启动脚本中止

  • 继续去了解keycloak启动过程,会发现依赖这个脚本docker-entrypoint.sh,而上面的报错信息会中止该脚本运行,从而中止启动过程,核心其实是这一句set -eou pipefail
  • 在这个用户后面,一位大佬Bruno Ranschaert 回复了下,给了解决方法You can repair the failing container by first copying this file from the container to your local machine "docker cp keycloak:/opt/jboss/tools/docker-entrypoint.sh ." Comment out the line "set -eou pipefail", copy it back into the container using "docker cp docker-entrypoint.sh keycloak:/opt/jboss/tools/" and restart the container. After a clean startup/shutdown, you could restore (uncomment) this line again,渣翻一下如下:

你可以通过将该文件从容器复制到本地机器来修复故障容器:“docker cp keycloak:/opt/jboss/tools/docker-entrypoint.sh .”将其注释掉 “set -eou pipefail” 这一行,然后使用“docker cp docker-entrypoint.sh keycloak:/opt/jboss/tools/”将其复制回容器,并重新启动容器。在干净的启动/关闭之后,你可以再次恢复(取消注释)这一行。“

  • 这个修改和拷贝的方式,虽然有用,但是对于我来说还需要改进下,因为如果容器删除,或者在新的服务器部署,这个操作还要来一遍
  • 思路很简单,直接把这个文件映射出来,修改好,后续无论是删除容器重建还是新服务器部署,把文件放到对应位置即可
  • 使用docker cp命令将docker-entrypoint.sh拷贝出来,注释掉 “set -eou pipefail” 这一行,放到我们的服务器的某个位置(我放在了./volumes/keycloak-customized/下)
  • 然后修改docker-compose 配置,在volumes增加一个映射,如下:
    volumes:
      - ./volumes/keycloak-customized/docker-entrypoint.sh:/opt/jboss/tools/docker-entrypoint.sh
  • 至此结束,看到这里的小伙伴,如果对你有帮助,欢迎来一个评论交流下或给个赞

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/545270.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE5中如何新建C++类?

UE5 插件开发指南 前言0.如何在UE编辑器内创建C++类?1.如何在UE编辑器外创建C++类?前言 这个问题应该细分成两个问题: (1)如何在编辑器内创建C++类? (2)如何在编辑器外创建C++类? 问题(1)主要针对那些可以在编辑器内继承并创建的类,然而有些内是无法在编辑内继承的,必须在…

overflow属性的常用值详解

什么是overflow 在CSS中,overflow是“溢出”的意思,该属性规定当内容溢出元素框时发生的事情,设置内容是否会被修剪,溢出部分是否会被隐藏;例如当属性值设置为“visible”则内容不会被修剪,为“hidden”则内…

软件测试用例包括_白盒测试用例

测试用例分层 每个测试用例都有1个或多个测试步骤(List[step]),每个测试步骤对应一个API请求或其他用例的引用。 从上图分析,我们可以看到testsuite中包含了3个测试用例,testcase1中有4个请求和一个步骤teststep12&am…

LeetCode:25. K 个一组翻转链表

25. K 个一组翻转链表 1)题目2)思路3)代码4)结果 1)题目 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。…

研发工程师玩转Kubernetes——通过文件创建Pod

在《研发工程师玩转Kubernetes——部署应用》中,我们使用kubectl run命令启动了一个可以在kubernetes集群内部访问的nginx——它不可以通过物理机访问。而我们使用文件创建时,则可以通过设置相关参数,让nginx可以通过物理机地址访问。 创建P…

【社工】NodeJS 应用仓库钓鱼

前言 城堡总是从内部攻破的。再强大的系统,也得通过人来控制。如果将入侵直接从人这个环节发起,那么再坚固的防线,也都成为摆设。 下面分享一个例子,利用应用仓库,渗透到开发人员的系统中。 应用仓库 应用仓库对于开…

手写决策树算法——基于决策树的XX联盟游戏胜负预测

机器学习 基于决策树的 XX联盟游戏胜负预测 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/ar…

用Powerpoint (PPT)制作并导出矢量图、高分辨率图

论文写作时经常需要导入矢量图,正规军都是用AI或者Inkscape,但是PPT更加适合小白用户,或者一些简单的构图需求,而且不得不承认PPT的某些功能是真的香,例如:简单的对齐、文字插入和格式修改等等。但是PPT是不…

Ansys仿真TDR

1、TDR测量的原理: 2、时域反射计TDR的电路仿真 打开Ansys的TDR电路例程,单端电路和TDR源的设置如下图所示,被测的DUT为4段传输线和一个电容,一个电感。 TDR测的结果如下: 信号到负载电容的时间为1.5ns,然…

Cesium源码分享--气泡窗

Cesium气泡窗插件 在线api文档说明 在线体验地址 更多案例地址 免费gis数据 ps:如果可以的话,希望大家能给我个star,好让我有更新下去的动力; 实现原理: Cesium和我们平时常见的leaflet、ol以及arcgis api是不一样…

组合数学公式

1、8个相同的球放进4个相同的盒子里,每盒至少一个,有几种方法 ? 公式:球相同,盒相同,拆分公式。 P4(8)P1(4)P2(4)P3(4)P4(4) 1211 5 2、8个相同的球放进4个不同的盒子里,每盒至少一个&#xff…

GPT学习笔记-聚类(clustering)

1. 什么是clustering 聚类是一种非常有用的无监督学习技术,它的主要目的是发现数据的内在结构和模式。在许多实际应用中,我们可能没有明确的目标变量或预测目标,但我们仍希望了解数据的组织方式,或者找出数据中的特定模式或组。这…

如何构造HTTP请求

直接通过浏览器地址栏 具体的流程,直接通过浏览器地址栏,输入一个url >构造出一个GET请求 html中,一些特殊标签,也会触发GET请求 1) link 2) script 3) img 4) a以上的几个标签都会触发Get请求了. form表单,可以触发GET和POST请求 form 的重要参数: action: 构造的 HTT…

【Redis面试点总结】

1、缓存 1.1、穿透 查询一个空数据,mysql也查不到也不会写入缓存可能导致多次请求数据库 方案一:缓存设空即可(可能发生数据不一致就是这条数据有了但此时缓存是空,消耗内存) 方案二:布隆过滤器&#x…

hive数据库hql基础操作02

1.内部表和外部表 默认情况下创建的表就是内部表,Hive拥有该表的结构和文件。换句话说,Hive完全管理表(元数据和数据)的生命周期,类似于RDBMS中的表。当你删除内部表时,它会删除数据以及表的元数据。可以使…

【python】价值25~30K的国外企业招聘面试考题

目录标题 前言案例介绍网站分析代码展示尾语 💝 前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 今天的这个案例,是一位同学的面试题,人在国外,月薪25~30K 本来以为是难度很大的反pa、逆向或者算法之类的, 谁知道…

深度学习笔记1——CNN识别黑白手写数字

文章目录 摘要手写数字数据集(MNIST)卷积神经网络(Convolution Neural Network, CNN)模型架构搭建Softmax函数和CrossEntropy损失函数Adam 优化器 构造数据迭代器训练、验证、测试模型训练结果可视化 摘要 本文将介绍CNN的开山之…

读书笔记--读数学之美有感

大概是在10年前,无意间读到吴军老师撰写得数学之美,感觉吴老师对数学与信息论的结合讲述的太好了,吴老师结合自身的多年工作经历将信息技术中用到的数学,特别是数学里面的很多概率论、线性代数、模型算法、编解码规则等&#xff0…

gunicorn常用参数命令

Gunicorn 是一个 Python 的 WSGI HTTP 服务器。具有实现简单,轻量级,高性能等特点。更多介绍内容参考官网,这里介绍几个常用参数。 安装 pip3 install gunicorn通过输入gunicorn -v查看版本。 最简洁的启动。首先进入到项目目录,例如django项目和mana…

Vue中通过集成Quill富文本编辑器实现公告的发布。Vue项目中vue-quill-editor的安装与使用【实战开发应用】

前言 闲的无聊、给原有的系统添加一个公告的功能。就是后台可以写一些公告信息,然后前台可以看到发布的信息。一般来说一个公告就是一些文字描述图片视频等。还有排版样式啥的。使用文本编辑器就可以实现。然后正好用到了Quill,通过Quill富文本编辑器集成…