KeyCloak Docker compose: 禁止覆盖表
KeyCloak Docker compose: Disable overwriting of tables
我正在尝试使用 docker 组合来设置 Keycloak:
version: '2'
services:
keycloak:
image: jboss/keycloak:9.0.0
command:
[
'-b',
'0.0.0.0',
'-Dkeycloak.migration.action=import',
'-Dkeycloak.migration.provider=dir',
'-Dkeycloak.migration.dir=/opt/jboss/keycloak/realm-config',
'-Dkeycloak.migration.strategy=IGNORE_EXISTING',
'-Djboss.socket.binding.port-offset=1000',
'-Djboss.as.management.blocking.timeout=1000',
'-Dkeycloak.profile.feature.upload_scripts=enabled'
]
volumes:
- ./realm-config:/opt/jboss/keycloak/realm-config
environment:
- KEYCLOAK_USER=admin
- KEYCLOAK_PASSWORD=admin
- DB_VENDOR=MYSQL
- DB_ADDR=testmysqldb.mysql.database.azure.com
- DB_USER=testuser
- DB_PASSWORD=testpassword
- DB_DATABASE=keycloak
ports:
- 9080:9080
- 9443:9443
- 10990:10990
设置所有表需要很长时间,但最终创建了表。但是,一段时间后 jboss 启动超时。当我尝试重新启动容器时,出现以下错误:
ERROR [org.keycloak.connections.jpa.updater.liquibase.conn.DefaultLiquibaseConnectionProvider] (ServerService Thread Pool -- 68) Change Set META-INF/jpa-changelog-authz-4.0.0.CR1.xml::authz-4.0.0.CR1::psilva@redhat.com failed. Error: Table 'resource_server_perm_ticket' already exists [Failed SQL: CREATE TABLE keycloak_new.RESOURCE_SERVER_PERM_TICKET (ID VARCHAR(36) NOT NULL, OWNER VARCHAR(36) NOT NULL, REQUESTER VARCHAR(36) NOT NULL, CREATED_TIMESTAMP BIGINT NOT NULL, GRANTED_TIMESTAMP BIGINT NULL, RESOURCE_ID VARCHAR(36) NOT NULL, SCOPE_ID VARCHAR(36) NULL, RESOURCE_SERVER_ID VARCHAR(36) NOT NULL)]
15:08:40,541 FATAL [org.keycloak.services] (ServerService Thread Pool -- 68) java.lang.RuntimeException: Failed to update database
我找不到解决此错误的任何解决方案。基本上,一旦表存在,我希望 keycloak 不要尝试覆盖它们。我确定我在这里缺少配置。有人可以帮助我吗?
最后我在独立模式下通过 运行 keycloak 解决了这个问题。它创建了没有任何超时问题的数据库结构。
创建数据库后,我以 docker 模式启动 keycloak 并连接到外部数据库。开始没有任何问题。
我正在尝试使用 docker 组合来设置 Keycloak:
version: '2'
services:
keycloak:
image: jboss/keycloak:9.0.0
command:
[
'-b',
'0.0.0.0',
'-Dkeycloak.migration.action=import',
'-Dkeycloak.migration.provider=dir',
'-Dkeycloak.migration.dir=/opt/jboss/keycloak/realm-config',
'-Dkeycloak.migration.strategy=IGNORE_EXISTING',
'-Djboss.socket.binding.port-offset=1000',
'-Djboss.as.management.blocking.timeout=1000',
'-Dkeycloak.profile.feature.upload_scripts=enabled'
]
volumes:
- ./realm-config:/opt/jboss/keycloak/realm-config
environment:
- KEYCLOAK_USER=admin
- KEYCLOAK_PASSWORD=admin
- DB_VENDOR=MYSQL
- DB_ADDR=testmysqldb.mysql.database.azure.com
- DB_USER=testuser
- DB_PASSWORD=testpassword
- DB_DATABASE=keycloak
ports:
- 9080:9080
- 9443:9443
- 10990:10990
设置所有表需要很长时间,但最终创建了表。但是,一段时间后 jboss 启动超时。当我尝试重新启动容器时,出现以下错误:
ERROR [org.keycloak.connections.jpa.updater.liquibase.conn.DefaultLiquibaseConnectionProvider] (ServerService Thread Pool -- 68) Change Set META-INF/jpa-changelog-authz-4.0.0.CR1.xml::authz-4.0.0.CR1::psilva@redhat.com failed. Error: Table 'resource_server_perm_ticket' already exists [Failed SQL: CREATE TABLE keycloak_new.RESOURCE_SERVER_PERM_TICKET (ID VARCHAR(36) NOT NULL, OWNER VARCHAR(36) NOT NULL, REQUESTER VARCHAR(36) NOT NULL, CREATED_TIMESTAMP BIGINT NOT NULL, GRANTED_TIMESTAMP BIGINT NULL, RESOURCE_ID VARCHAR(36) NOT NULL, SCOPE_ID VARCHAR(36) NULL, RESOURCE_SERVER_ID VARCHAR(36) NOT NULL)] 15:08:40,541 FATAL [org.keycloak.services] (ServerService Thread Pool -- 68) java.lang.RuntimeException: Failed to update database
我找不到解决此错误的任何解决方案。基本上,一旦表存在,我希望 keycloak 不要尝试覆盖它们。我确定我在这里缺少配置。有人可以帮助我吗?
最后我在独立模式下通过 运行 keycloak 解决了这个问题。它创建了没有任何超时问题的数据库结构。 创建数据库后,我以 docker 模式启动 keycloak 并连接到外部数据库。开始没有任何问题。