我有一个Keycloak安装作为码头容器在一个码头-合成环境中运行。每天晚上,我的备份都会停止相关的容器,执行DB和卷备份,然后重新启动容器。对大多数人来说,这是可行的,但是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 | ]密钥披风的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环境变量,否则容器会抱怨用户已经存在并且不再启动。知道怎么解决吗?
发布于 2020-06-24 19:55:29
2021年5月23日更新:
这个问题已经在RedHats Jira上解决了,它似乎在版本12中得到了解决。
根据RedHat支持,这是一个已知的“问题”,不应该被修复。他们希望将精力集中在一个工作流上,在这个工作流中,容器被移除和重新创建,而不是启动和停止。他们同意总的问题,但指出目前没有可用的资源。停止并启动容器是当前不支持的操作。
发布于 2021-01-01 01:31:37
重新启动的一个合法用例是添加调试日志记录。例如,使用外部标识提供程序调试身份验证。
最后,我创建了一个shell脚本,用于:
停止container
更改所需的映像
然而,码头的一个很好的特点是能够自动重新启动停止的容器,减少停机时间。这个Keycloak错误夺走了这个特性。
发布于 2021-03-09 21:03:11
我在这里也有同样的问题,我的解决办法是:
docker export CONTAINER_NAME > latest.tar
2-在码头上创建一个新卷
docker volume create VOLUME_NAME
3-启动一个新的码头容器,将创建的卷映射到容器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 inspect volume VOLUME_NAME查找路径。
7-启动停运的集装箱
这对我来说很有用,我希望它能对下一个人解决这个问题很有帮助。
https://stackoverflow.com/questions/62402630
复制相似问题