как заставить keycloak экспортировать пользователей области и затем выйти - PullRequest
0 голосов
/ 20 марта 2020

Мы запускаем образ Keycloak docker в AWS ECS, и нам нужен способ экспорта области и всех пользователей в целях автоматизации с использованием ansible. Мы можем запустить следующую команду с ansible, чтобы запустить экспорт

docker exec -i 702f2fd7858d \
  /bin/bash -c "export JDBC_PARAMS=?currentSchema=keycloak_service && 
  /opt/jboss/keycloak/bin/standalone.sh \
  -Djboss.socket.binding.port-offset=100 \
  -Dkeycloak.migration.action=export \
  -Dkeycloak.migration.provider=singleFile \
  -Dkeycloak.migration.realmName=API \
  -Dkeycloak.migration.usersExportStrategy=REALM_FILE \
  -Dkeycloak.migration.file=/tmp/my_realm.json"

, но контейнер docker продолжает работать после экспорта. Мы не можем выполнить поиск журналов в поисках завершения процесса экспорта, так как мы используем AWS Драйвер журналов для Docker, который предотвращает доступ к любым журналам. Жаль, что API Keycloak REST не поддерживает включение пользователей в существующую конечную точку частичного экспорта или, по крайней мере, наличие конечной точки, которая запускает экспорт области, включая пользователей, в смонтированную файловую систему.

1 Ответ

1 голос
/ 01 апреля 2020

Несколько дней назад я столкнулся с той же проблемой go и внедрил рабочее решение:

# Copy a script to the keycloak container to perform an export
docker cp docker-exec-cmd.sh keycloak:/tmp/docker-exec-cmd.sh
# Execute the script inside of the container
docker exec -it keycloak /tmp/docker-exec-cmd.sh
# Grab the finished export from the container
docker cp keycloak:/tmp/realms-export-single-file.json .
# docker-exec-cmd.sh


# If something goes wrong, this script does not run forever but times out
TIMEOUT_SECONDS=300
# Logfile for the keycloak export instance
LOGFILE=/tmp/standalone.sh.log
# destionation export file
JSON_EXPORT_FILE=/tmp/realms-export-single-file.json

rm -f ${LOGFILE} ${JSON_EXPORT_FILE}

# Start a new keycloak instance with exporting options enabled.
# Use prot offset to prevent port conflicts with the "real" keycloak instance.
timeout ${TIMEOUT_SECONDS}s \
    /opt/jboss/keycloak/bin/standalone.sh \
        -Dkeycloak.migration.action=export \
        -Dkeycloak.migration.provider=singleFile \
        -Dkeycloak.migration.file=${JSON_EXPORT_FILE} \
        -Djboss.socket.binding.port-offset=99 \
    > ${LOGFILE} &

# Grab the keycloak export instance process id
PID="${!}"

# Wait for the export to finish
timeout ${TIMEOUT_SECONDS}s \
    grep -m 1 "Export finished successfully" <(tail -f ${LOGFILE})

# Stop the keycloak export instance
kill ${PID}
...