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

10

我有一个安装在Docker容器中的Keycloak,并处于Docker Compose环境中。每晚,我的备份会停止相关的容器,执行数据库和卷备份,然后重新启动容器。对于大多数情况来说,这个方法都有效,但是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环境变量,否则容器会抱怨用户已经存在,并且无法启动。有什么想法如何修复这个问题吗?
3个回答

9

2021年5月23日更新:

该问题已在RedHat的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


2

重新启动的一个合法用例是添加调试日志。例如,为了调试与外部身份提供者的身份验证。

我最终创建了一个 shell 脚本,执行以下操作:

  • docker stop [container] 停止容器
  • docker rm [container] 删除容器
  • 重新创建所需镜像,并更改日志记录配置
  • docker run [options] [container] 运行容器

然而,Docker 的一个很好的特性是能够自动重新启动已停止的容器,从而减少停机时间。但这个 Keycloak bug 却剥夺了这个特性。


-1

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

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

docker export CONTAINER_NAME > latest.tar

2- 在docker中创建一个新的卷

docker volume create VOLUME_NAME

3 - 启动一个新的docker容器,将创建的卷映射到容器db路径,类似于这样:

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 - 启动停止的容器

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接