繁体   English   中英

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

[英]Keycloak 17.0.1 Import Realm on Docker / Docker-Compose Startup

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

我尝试过的事情:

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

2)我还尝试在我的 docker-compose 设置中为 keycloak 附加以下命令并且没有运气(也尝试使用“start”) - 它似乎只是忽略了命令(没有错误或任何东西):

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

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

4)我已经换档并试图看看是否有可能在容器启动后(即使有手动干预)只是为了恢复一些理智。 我尝试使用 admin-cli,但在不同的点/端点等进行了多次不同的尝试之后。我只是得到 localhost 拒绝连接。

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 初始化时导入领域。 请参阅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"]

正如@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上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM