docker Keycloak 未在 PostgreSQL 中保存数据

Keycloak is not saving data in PostgreSQL in docker

我正在尝试 运行 keycloak docker 并将其数据保存在 PostgreSQl 中。 但是什么都没有保存。

这是 docker-compose.yml 文件:

version: '2'

services:
  db:
    build: "./Main Database Backup"
    environment:
      POSTGRES_DB: ${DB_POSTGRES_APP_DATABASE}
      POSTGRES_USER: ${DB_POSTGRES_APP_USER}
      POSTGRES_PASSWORD: ${DB_POSTGRES_APP_PASSW}
      PGDATA: /var/lib/postgresql/data/pgdata
    ports:
      - "5432:5432"
    restart: unless-stopped

  keycloak-postgres:
    image: postgres:10-alpine
    environment:
      POSTGRES_DB: ${KEYCLOAK_DATABASE}
      POSTGRES_PASSWORD: ${KEYCLOAK_DATABASE_PASSW}
      POSTGRES_USER: ${KEYCLOAK_DATABASE_USER}
      PGDATA: /var/lib/postgresql/data/pgdata
    restart: unless-stopped

  keycloak:
    build: "./Keycloak Realm Export"
    depends_on:
      - keycloak-postgres
    environment:
      KEYCLOAK_USER: ${KEYCLOAK_USER}
      KEYCLOAK_PASSWORD: ${KEYCLOAK_PASSWORD}
      POSTGRES_USER: ${KEYCLOAK_DATABASE_USER}
      POSTGRES_PASSWORD: ${KEYCLOAK_DATABASE_PASSW}
      POSTGRES_PORT_5432_TCP_ADDR: keycloak-postgres
    ports:
      - "8080:8080"

keycloak

中的 Dockerfile
FROM jboss/keycloak:3.4.3.Final

WORKDIR /opt/jboss/keycloak

COPY realm-export.json initial_data.json

# RUN ./bin/standalone.sh -Dkeycloak.migration.action=import -Dkeycloak.migration.provider=singleFile -Dkeycloak.migration.file=initial_data.json -Dkeycloak.migration.strategy=OVERWRITE_EXISTING

RUN ./bin/add-user-keycloak.sh -r master -u admin -p password

ENTRYPOINT [ "/opt/jboss/docker-entrypoint.sh" ]

CMD ["-b", "0.0.0.0", "-Dkeycloak.import=/opt/jboss/keycloak/initial_data.json"]

db 是我 API 的主数据库,它工作正常。 keycloak-postgres 是 keycloak 的数据库,它不保存任何数据。

此外,我还在该服务器中创建了一个与 ${KEYCLOAK_DATABASE} 同名的数据库,并且我创建了一个用户并将所有权限授予该服务器,因此不会出现权限错误。

并且我已经正确提供了所有环境变量。

另外关于 keycloak Dockerfile 中的注释代码,我正在尝试导入一个不起作用的领域。

当我在 docker-compose.yml 中评论 POSTGRES_PORT_5432_TCP_ADDR 时抛出此错误:

2018-08-31T08:22:05.251344638Z 08:22:05,250 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) WFLYCTL0013: Operation ("add") failed - address: ([
2018-08-31T08:22:05.251375320Z     ("subsystem" => "datasources"),
2018-08-31T08:22:05.251383320Z     ("data-source" => "KeycloakDS")
2018-08-31T08:22:05.251402169Z ]) - failure description: "WFLYCTL0211: Cannot resolve expression 'jdbc:postgresql://${env.POSTGRES_PORT_5432_TCP_ADDR}:${env.POSTGRES_PORT_5432_TCP_PORT:5432}/${env.POSTGRES_DATABASE:keycloak}'"

这与 Keycloak 无关,它更 Docker 容器相关(和 postgres)。每次停止容器时,您都会丢失数据。

您需要使用的是卷...意思。将 PC 上的驱动程序映射到 docker 容器。这样,每次容器再次启动时,它都会使用此驱动器,因此能够保留数据。您需要以下内容:

version: '2'

volumes:
  postgres_data:
    driver: local

services:
  db:
    build: "./Main Database Backup"
    environment:
      POSTGRES_DB: ${DB_POSTGRES_APP_DATABASE}
      POSTGRES_USER: ${DB_POSTGRES_APP_USER}
      POSTGRES_PASSWORD: ${DB_POSTGRES_APP_PASSW}
      PGDATA: /var/lib/postgresql/data/pgdata
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./data:/docker-entrypoint-initdb.d
    ports:
      - "5432:5432"
    restart: unless-stopped