【问题标题】:Keycloak Docker container fails to start after restarting the containerKeycloak Docker 容器重启后无法启动
【发布时间】:2020-10-05 17:10:21
【问题描述】:

我有一个 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 环境变量,否则容器会抱怨用户已经存在并且不再启动。知道如何解决这个问题吗?

【问题讨论】:

    标签: docker wildfly keycloak


    【解决方案1】:

    2021 年 5 月 23 日更新:

    问题已经在 RedHats Jira 上解决了,好像在版本 12 中解决了。相关的 GitHub pull request 可以在这里找到: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 [容器]
      • docker rm [容器]
      • 通过更改日志配置重新创建我想要的图像
      • docker run [选项] [容器]

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

      【讨论】:

        【解决方案3】:

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

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

        docker export CONTAINER_NAME &gt; 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 - 启动停止的容器

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

        【讨论】:

          猜你喜欢
          • 2018-10-04
          • 2021-04-21
          • 2022-10-06
          • 2020-09-16
          • 1970-01-01
          • 1970-01-01
          • 2018-05-16
          • 2014-09-24
          相关资源
          最近更新 更多