Keycloak Docker 容器重启后容器启动失败
Keycloak Docker container fails to start after restarting the container
我在 docker-compose 环境中安装了一个 Keycloak 运行 作为 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=admin
和 KEYCLOAK_PASSWORD
环境变量,否则容器会抱怨用户已经存在并且不再启动。知道如何解决这个问题吗?
2021 年 5 月 23 日更新:
问题已在 RedHats Jira 上解决,似乎在版本 12 中已解决。相关 GitHub 拉取请求可在此处找到:https://github.com/keycloak/keycloak-containers/pull/286
根据 RedHat 支持,这是一个已知的“问题”,不应修复。他们希望专注于一个容器被删除和重新创建的工作流程,而不是启动和停止。他们同意一般性问题,但表示目前没有可用资源。停止和启动容器是目前不支持的操作。
重新启动的合法用例是添加调试日志记录。例如,使用外部身份提供程序调试身份验证。
我最终创建了一个 shell 脚本来执行以下操作:
- docker停止[容器]
- docker rm [容器]
- 通过更改日志配置重新创建我想要的图像
- docker运行[选项][容器]
然而,docker 的一个不错的功能是能够自动重启已停止的容器,从而减少停机时间。这个 Keycloak 错误使该功能消失了。
我这里遇到了同样的问题,我的解决办法是:
- 将 docker 容器导出到 .tar 文件:
docker export CONTAINER_NAME > latest.tar
2- 在 docker
中创建一个新卷
docker volume create VOLUME_NAME
3 - Start 一个新的 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 - Start 停止的容器
这对我有用,我希望它对下一个解决这个问题的人很有帮助。
我在 docker-compose 环境中安装了一个 Keycloak 运行 作为 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=admin
和 KEYCLOAK_PASSWORD
环境变量,否则容器会抱怨用户已经存在并且不再启动。知道如何解决这个问题吗?
2021 年 5 月 23 日更新:
问题已在 RedHats Jira 上解决,似乎在版本 12 中已解决。相关 GitHub 拉取请求可在此处找到:https://github.com/keycloak/keycloak-containers/pull/286
根据 RedHat 支持,这是一个已知的“问题”,不应修复。他们希望专注于一个容器被删除和重新创建的工作流程,而不是启动和停止。他们同意一般性问题,但表示目前没有可用资源。停止和启动容器是目前不支持的操作。
重新启动的合法用例是添加调试日志记录。例如,使用外部身份提供程序调试身份验证。
我最终创建了一个 shell 脚本来执行以下操作:
- docker停止[容器]
- docker rm [容器]
- 通过更改日志配置重新创建我想要的图像
- docker运行[选项][容器]
然而,docker 的一个不错的功能是能够自动重启已停止的容器,从而减少停机时间。这个 Keycloak 错误使该功能消失了。
我这里遇到了同样的问题,我的解决办法是:
- 将 docker 容器导出到 .tar 文件:
docker export CONTAINER_NAME > latest.tar
2- 在 docker
中创建一个新卷docker volume create VOLUME_NAME
3 - Start 一个新的 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 - Start 停止的容器
这对我有用,我希望它对下一个解决这个问题的人很有帮助。