Keycloak 17.0.1 在 Docker / Docker-Compose 启动上导入领域

问题描述 投票:0回答:3

我正在尝试找到一种在 Keycloak 版本 17.0.1 中导入领域的方法,该方法可以在启动 docker 容器(使用 docker-compose)时完成。我希望能够在“启动”模式而不是“启动开发”模式下执行此操作,因为根据我迄今为止的经验,17 中的“启动开发”强制使用 H2/in-mem 数据库,并且不允许我指向我希望在本地运行时能够更类似于开发/生产环境的外部数据库。

我尝试过的事情:

1) 根据 Github 上最近的对话(Issue 10216Issue 10754 等),用于允许此操作的环境变量(某些版本中的 KEYCLOAK_IMPORT 或 KC_IMPORT_REALM)不再是触发此操作。在我的尝试中,它也不适用于 17.0.1 版本。

2)我还尝试在 keycloak 的 docker-compose 设置中附加以下命令,但没有运气(也尝试过仅使用“start”) - 它似乎只是忽略该命令(没有错误或任何内容):

command: ["start-dev", "-Dkeycloak.import=/tmp/my-realm.json"]

3) 我尝试在 Dockerfile 中运行 kc.sh 命令“导入”(在入口点/启动之前和之后),但收到错误:索引 1 中的参数不匹配:'/opt/keycloak/bin/kc.sh' , 'im port', '--file', '/tmp/my-realm.json'

4)我已经换档并尝试看看是否可以在容器启动后执行此操作(即使有手动干预)只是为了恢复一些理智。我尝试使用 admin-cli,但在不同的点/端点等进行了相当多的不同尝试之后。我只是发现本地主机拒绝连接。

bin/kcadm.sh  config credentials --server http://localhost:8080/auth --realm master --user admin --password adminpassword

点击以下端口时响应,如图所示:

8080:发送请求失败 - 连接到 localhost:8080 [localhost/127.0.0.1] 失败:连接被拒绝(连接被拒绝)

8443:发送请求失败 - localhost:8443 未能响应

我确信我还尝试过其他方法,但现在都忘记了——此时我已经有点不知所措了。

我的代码(与Keycloak网站上的最新文档基本相同):

Dockerfile:

FROM quay.io/keycloak/keycloak:17.0.1 as builder

ENV KC_METRICS_ENABLED=true
ENV KC_FEATURES=token-exchange
ENV KC_DB=postgres
RUN /opt/keycloak/bin/kc.sh build

FROM quay.io/keycloak/keycloak:17.0.1
COPY --from=builder /opt/keycloak/lib/quarkus/ /opt/keycloak/lib/quarkus/
WORKDIR /opt/keycloak
# for demonstration purposes only, please make sure to use proper certificates in production instead
ENV KC_HOSTNAME=localhost
RUN keytool -genkeypair -storepass password -storetype PKCS12 -keyalg RSA -keysize 2048 -dname "CN=server" -alias server -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -keystore conf/server.keystore

ENTRYPOINT ["/opt/keycloak/bin/kc.sh", "start" ]

Docker-compose.yml:

version: "3"

services:
  keycloak:
    build:
      context: .
    volumes:
      - ./my-realm.json:/tmp/my-realm.json:ro
    env_file:
      - .env
    environment:
      KC_DB_URL: ${POSTGRESQL_URL}
      KC_DB_USERNAME: ${POSTGRESQL_USER}
      KC_DB_PASSWORD: ${POSTGRESQL_PASS}
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: adminpassword
    ports:
      - 8080:8080
      - 8443:8443 # <-- I've tried with only 8080 and with only 8443 as well. 8443 appears to be the only that I can get the admin console ui to even work on though.
    networks:
      - my_net
networks:
  my_net:
    name: my_net

任何关于如何以编程+“dev-opsy”方式做到这一点的建议将不胜感激。我真的很想让这个工作,但我很困惑如何克服这个问题。

docker docker-compose keycloak keycloak-rest-api
3个回答
4
投票

尚不支持通过配置在 docker 初始化时导入领域。请参阅https://github.com/keycloak/keycloak/issues/10216。他们可能会在下一个版本 v18 中发布此功能。

人们在 github 线程中分享的解决方法是创建自己的 docker 映像并在构建时通过 json 文件导入领域。

FROM quay.io/keycloak/keycloak:17.0.1

# Make the realm configuration available for import
COPY realm-and-users.json /opt/keycloak_import/

# Import the realm and user
RUN /opt/keycloak/bin/kc.sh import --file /opt/keycloak_import/realm-and-users.json

# The Keycloak server is configured to listen on port 8080
EXPOSE 8080
EXPOSE 8443

# Import the realm on start-up
CMD ["start-dev"]

3
投票

正如 @tboom 所说,keycloak 17.x 尚不支持它。但现在 keycloak 18.x 使用

--import-realm
选项支持它:

bin/kc.[sh|bat] [start|start-dev] --import-realm

此功能不再像以前那样工作。不得再指定 JSON 文件路径:只需将 JSON 文件复制到

<KEYCLOAK_DIR>/data/import
目录中(支持多个 JSON 文件)。请注意,如果领域已存在,则将跳过导入操作,因此不再可能进行增量更新(至少暂时)。

此功能记录在 https://www.keycloak.org/server/importExport#_importing_a_realm_during_startup


0
投票

我为此苦苦挣扎了很多......

但是正如我之前的 Marc Wrobels 所指出的:关键是将导入文件放入 opt/keycloak/data/import/ 并调用 --import-realm

就我而言,我在 docker-compose.yml 中这样做了:

 keycloak:
    build:
      context: ./config/keycloak
    command: ["start-dev", "--import-realm"]
    environment:
      # KC Credentials
      - KC_BOOTSTRAP_ADMIN_USERNAME=${KC_TEMP_ADMIN}  
      - KC_BOOTSTRAP_ADMIN_PASSWORD=${KC_TEMP_PASSWORD}  
      # KC Database Credentials
      - KC_DB=postgres
      - KC_DB_URL=jdbc:postgresql://database:5432/${KC_DB_NAME}
      - KC_DB_USERNAME=${KC_DB_USER}
      - KC_DB_PASSWORD=${KC_DB_PASSWORD}
      - KEYCLOAK_IMPORT=/opt/keycloak/imports/myrealm-config.json  
    ports:
      - "8080:8080"
    depends_on:
      - database

并在我添加的 Dockerfile 中

COPY myrealm-config.json /opt/keycloak/data/import/

如果文件放在容器中的其他位置,它将无法工作。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.