[英]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.