使用 docker-compose 时导入 keycloak 配置文件

Posted

技术标签:

【中文标题】使用 docker-compose 时导入 keycloak 配置文件【英文标题】:Importing keycloak configuration files while using docker-compose 【发布时间】:2019-07-14 18:14:02 【问题描述】:

我正在尝试将配置从一个 keycloak 实例导入到许多不同的 keycloak 实例中(每个实例都用于同一个应用程序,只是我的 CICD 流程中的不同部分)

我正在通过 Docker 运行 keycloak,发现很难导入所需的 json 文件

为了获得我想要导入的实际数据,我进入了所需的领域,只需单击导出按钮并选择客户端等。这将一个文件下载到我的浏览器中,现在我想在构建 docker 容器时导入该文件

我尝试了很多我在网上找到的不同方法,但似乎没有任何效果,所以我很感激一些帮助

我尝试的第一件事是使用以下命令通过 docker-compose 文件导入文件

KEYCLOAK_IMPORT: /realm-export.json

接下来我尝试的也是在我尝试过的 docker-compose 中

command: "-b 0.0.0.0 -Djboss.http.port=8080 -Dkeycloak.migration.action=import -Dkeycloak.import=realm-export.json

最后,我尝试进入我的 Dockerfile 并使用以下命令将导入作为我的 CMD 运行

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

下面是我目前没有添加导入的 docker-compose 和 Dockerfiles,它们可能有助于回答这个问题。提前致谢

# Dockerfile
FROM jboss/keycloak:4.8.3.Final
COPY keycloak-metrics-spi-1.0.1-SNAPSHOT.jar keycloak/standalone/deployments

我的 docker-compose 文件中与 keycloak 相关的部分

postgres:
    image: postgres
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: keycl0ak
      POSTGRES_USER: keycl0ak
      POSTGRES_PASSWORD: password
    ports:
      - 5431:5431

  keycloak:
    build:
      context: services/keycloak
    environment:
      DB_VENDOR: POSTGRES
      DB_ADDR: postgres
      DB_DATABASE: keycl0ak
      DB_USER: keycl0ak
      DB_PASSWORD: password
      KEYCLOAK_USER: administrat0r
      KEYCLOAK_PASSWORD: asc88a8c0ssssqs
    ports:
      - 8080:8080
    depends_on:
      - postgres

volumes:
    postgres_data:
      driver: local

【问题讨论】:

【参考方案1】:

说明

首先,您需要先将文件复制到容器中,然后才能将其导入 Keycloak。您可以将realm-export.json 放在docker-compose.yml 旁边的文件夹中,假设我们称之为imports。这可以使用volumes: 来实现。一旦文件被复制到容器中,您就可以像以前一样使用command:,指向容器中的正确文件。

文件结构

/your_computer/keycloak_stuff/ |-- docker-compose.yml |-- imports -> realm-export.json

Docker 编写

这是 docker-compose.yml 在更改后的外观:

postgres:
    image: postgres
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: keycl0ak
      POSTGRES_USER: keycl0ak
      POSTGRES_PASSWORD: password
    ports:
      - 5431:5431

  keycloak:
    build:
      context: services/keycloak
    volumes:
      - ./imports:/opt/jboss/keycloak/imports
    command: 
      - "-b 0.0.0.0 -Dkeycloak.import=/opt/jboss/keycloak/imports/realm-export.json"
    environment:
      DB_VENDOR: POSTGRES
      DB_ADDR: postgres
      DB_DATABASE: keycl0ak
      DB_USER: keycl0ak
      DB_PASSWORD: password
      KEYCLOAK_USER: administrat0r
      KEYCLOAK_PASSWORD: asc88a8c0ssssqs
    ports:
      - 8080:8080
    depends_on:
      - postgres

volumes:
    postgres_data:
      driver: local

【讨论】:

有用的答案,只是一个注释。将文件添加到容器后,也可以使用环境属性将其导入,如:environment: KEYCLOAK_IMPORT: /opt/jboss/keycloak/imports/realm-export.jsonIMO,它看起来更干净了 我们可以在单独的 Dockerfile 中使用 command: 属性(在 keycloak 下)吗? 注意@JesusBenito 的回答:我必须在命令字符串中添加“-Dkeycloak.profile.feature.upload_scripts=enabled”,似乎在较新的keycloak 版本中禁用了导入(参见@ 987654321@) 鉴于导出的领域包含多个“秘密”,分发包含此类导入领域的 docker 映像是否安全?在导入过程中会重新生成秘密/盐/种子/...吗? 请注意,如果您使用默认的“主”领域,则导入不起作用。您应该使用另一个名称创建一个新领域。【参考方案2】:

总结@JesusBenito 和@raujonas 的答案,可以更改docker-compose,以便您使用keyloak 环境KEYCLOAK_IMPORT:

keycloak:
    volumes:
      - ./imports:/opt/jboss/keycloak/imports
    # command: not needed anymore
    #  - "-b 0.0.0.0 -Dkeycloak.import=/opt/jboss/keycloak/imports/realm-export.json"
    environment:
      KEYCLOAK_IMPORT: /opt/jboss/keycloak/imports/realm-export.json -Dkeycloak.profile.feature.upload_scripts=enabled          
      DB_VENDOR: POSTGRES
      DB_ADDR: postgres
      DB_DATABASE: keycl0ak
      DB_USER: keycl0ak
      DB_PASSWORD: password
      KEYCLOAK_USER: administrat0r
      KEYCLOAK_PASSWORD: asc88a8c0ssssqs

【讨论】:

以上是关于使用 docker-compose 时导入 keycloak 配置文件的主要内容,如果未能解决你的问题,请参考以下文章

docker-compose 构建mongodb并导入基础数据示例

来自 docker-compose .env 文件的多个 Docker 构建参数

Docker-compose mysql:导入 .sql

在docker python中缺少环境变量:3使用docker-compose

Memcached实录PHP项目Yii2框架本地Docker-compose部署Memcached的坑/Yii2跨项目使用Memcached的key解决方案/亲测可用带源码建议收藏

Memcached实录PHP项目Yii2框架本地Docker-compose部署Memcached的坑/Yii2跨项目使用Memcached的key解决方案/亲测可用带源码建议收藏