Keycloak Docker 容器在重新启动容器后无法启动



我有一个Keycloak安装作为docker-compose环境中的docker容器运行。每天晚上,我的备份都会停止相关容器,执行数据库和卷备份,然后再次重新启动容器。对于大多数人来说,它有效,但 Keycloak 似乎有问题,之后不会再出现。查看日志,错误消息为:

The batch failed with the following error: : 
keycloak           | WFLYCTL0062: Composite operation failed and was rolled back. Steps that failed:
keycloak           | Step: step-9
keycloak           | Operation: /subsystem=datasources/jdbc-driver=postgresql:add(driver-name=postgresql, driver-module-name=org.postgresql.jdbc, driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource)
keycloak           | Failure: WFLYCTL0212: Duplicate resource [
keycloak           |     ("subsystem" => "datasources"),
keycloak           |     ("jdbc-driver" => "postgresql")
keycloak           | ]
...
The batch failed with the following error: : 
keycloak           | WFLYCTL0062: Composite operation failed and was rolled back. Steps that failed:
keycloak           | Step: step-9
keycloak           | Operation: /subsystem=datasources/jdbc-driver=postgresql:add(driver-name=postgresql, driver-module-name=org.postgresql.jdbc, driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource)
keycloak           | Failure: WFLYCTL0212: Duplicate resource [
keycloak           |     ("subsystem" => "datasources"),
keycloak           |     ("jdbc-driver" => "postgresql")
keycloak           | ]

Keycloak 的docker-compose.yml条目如下所示,重要数据明显删除

keycloak:
image: jboss/keycloak:8.0.1
container_name: keycloak
environment:
- PROXY_ADDRESS_FORWARDING=true
- DB_VENDOR=postgres
- DB_ADDR=db
- DB_DATABASE=keycloak
- DB_USER=keycloak
- DB_PASSWORD=<password>
- VIRTUAL_HOST=<url>
- VIRTUAL_PORT=8080
- LETSENCRYPT_HOST=<url>
volumes:
- /opt/docker/keycloak-startup:/opt/jboss/startup-scripts

我正在映射的卷是对 WildFly 进行一些更改,以确保它在反向代理下表现良好:

embed-server --std-out=echo
#  Enable https listener for the new security realm
/subsystem=undertow/ 
server=default-server/ 
http-listener=default 
:write-attribute(name=proxy-address-forwarding, 
value=true)
#  Create new socket binding with proxy https port
/socket-binding-group=standard-sockets/ 
socket-binding=proxy-https 
:add(port=443)
#  Enable https listener for the new security realm
/subsystem=undertow/ 
server=default-server/ 
http-listener=default 
:write-attribute(name=redirect-socket, 
value="proxy-https")

停止容器后,它不再启动,上面显示的消息。但是,删除容器并重新创建它工作正常。我试图在初始启动后删除卷,这也没有什么区别。我已经了解到,我必须在初始启动后删除KEYCLOAK_USER=adminKEYCLOAK_PASSWORD环境变量,否则容器会抱怨用户已经存在并且不再启动。知道如何解决这个问题吗?

2021 年 5 月 23 日的更新:

该问题已在 RedHats Jira 上得到解决,似乎已在版本 12 中解决。相关的 GitHub 拉取请求可以在这里找到:https://github.com/keycloak/keycloak-containers/pull/286


根据RedHat支持,这是一个已知的"问题",不应该被修复。他们希望专注于删除和重新创建容器的工作流,而不是启动和停止容器。他们同意普遍问题,但表示目前没有可用的资源。停止和启动容器是当前不支持的操作。

请参阅示例 https://issues.redhat.com/browse/KEYCLOAK-13094?jql=project%20%3D%20KEYCLOAK%20AND%20text%20~%20%22docker%20restart%22 以供参考

重新启动的合法用例是添加调试日志记录。例如,使用外部身份提供程序调试身份验证。

我最终创建了一个 shell 脚本,它做到了:

  • 码头工人停止 [容器]
  • 码头工人 RM [容器]
  • 通过更改日志记录配置重新创建所需的映像
  • 码头工人运行 [选项] [容器]

然而,docker 的一个不错的功能是能够自动重新启动停止的容器,从而减少停机时间。这个Keycloak错误取消了该功能。

我在这里遇到了同样的问题,我的解决方案是:

  1. 将 docker 容器导出到.tar文件:

docker export CONTAINER_NAME > latest.tar

2-在码头工人中创建新卷

docker volume create VOLUME_NAME

3 - 启动一个新的 docker 容器,将创建的卷映射到容器数据库路径,如下所示:

docker run --name keycloak2 -v keycloak_db:/opt/jboss/keycloak/standalone/data/ -p 8080:8080 -e PROXY_ADDRESS_FORWARDING=true -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=root jboss/keycloak

4 - 停止容器

5 - 解压缩 tar 文件并找到数据库路径,如下所示:

tar unpack path: /opt/jboss/keycloak/standalone/data

6 - 将路径内容移动到 docker 卷,如果不知道物理路径在哪里,请使用docker inspect volume VOLUME_NAME查找路径

7 - 启动停止的容器

这对我有用,我希望它对下一个人解决这个问题很有帮助。

相关内容

最新更新