第5章 Red Hat build of Keycloak をコンテナー内で実行する
コンテナーイメージから Red Hat build of Keycloak を実行します。
この章では、コンテナーを実行する際に最適なエクスペリエンスを実現するために、Red Hat build of Keycloak コンテナーイメージを最適化して実行する方法を説明します。
この章は、OpenShift 環境で実行するイメージのビルドにのみ適用されます。このイメージは OpenShift 環境のみをサポートします。他の Kubernetes ディストリビューションで実行する場合はサポートされません。
5.1. カスタマイズおよび最適化されたコンテナーイメージの作成 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトの Red Hat build of Keycloak コンテナーイメージは、すぐに設定および最適化できる状態で出荷されます。
Red Hat build of Keycloak コンテナーを最適に起動するには、コンテナーのビルド中に build
ステップを実行してイメージをビルドします。この手順を実行することで、後に続くコンテナーイメージの各起動フェーズで時間を節約できます。
5.1.1. 最適化された Red Hat build of Keycloak Containerfile の記述 リンクのコピーリンクがクリップボードにコピーされました!
次の Containerfile
は、ヘルスおよびメトリクスのエンドポイントとトークン交換機能を有効にし、PostgreSQL データベースを使用する、事前設定済みの Red Hat build of Keycloak イメージを作成します。
Containerfile:
ビルドプロセスには複数の段階が含まれます。
-
build
コマンドを実行してサーバーのビルドオプションを設定し、最適化されたイメージを作成します。 -
build
段階で生成されたファイルが、新しいイメージにコピーされます。 - 最後のイメージで、ホスト名とデータベースの追加の設定オプションが設定されているため、コンテナーの実行時にそれらを再度設定する必要はありません。
-
エントリーポイントで、
kc.sh
により、すべてのディストリビューションのサブコマンドがアクセス可能になります。
カスタムプロバイダーは、JAR ファイルを /opt/keycloak/providers
ディレクトリーに含めるステップを定義するだけでインストールできます。このステップは、以下のように、build
コマンドを RUNs
行の前に配置する必要があります。
5.1.2. 追加の RPM パッケージをインストールする リンクのコピーリンクがクリップボードにコピーされました!
FROM registry.redhat.io/rhbk/keycloak-rhel9
段階で新しいソフトウェアをインストールしようとすると、microdnf
、dnf
、さらには rpm
がインストールされていないことがわかります。また、利用できるパッケージは非常に少なく、bash
シェルと Red Hat build of Keycloak 自体の実行に必要なものしかありません。これは、Red Hat build of Keycloak の攻撃対象領域を減らすセキュリティー強化対策によるものです。
まず、ユースケースを別の方法で実装できるかどうかを検討し、なるべく最終的なコンテナーへの新規 RPM のインストールを回避します。
-
Containerfile 内の
RUN curl
命令は、リモート URL をネイティブにサポートしているため、ADD
に置き換えることができます。 -
一部の一般的な CLI ツールは、Linux ファイルシステムを創造的に使用することで置き換えることができます。たとえば、
ip addr show tap0
はcat /sys/class/net/tap0/address
にすることができます。 - RPM を必要とするタスクはイメージビルドの前の段階に移動し、代わりに結果をコピーできます。
以下は例です。前のビルド段階で update-ca-trust
を実行し、後の段階に結果をコピーします。
絶対に必要な場合は、ubi-micro で確立された次の 2 段階のパターンに従い、新しい RPM をインストールできます。
このアプローチでは chroot (/mnt/rootfs
) を使用します。これにより、指定したパッケージとその依存関係のみがインストールされるため、当て推量で作業することなく、それらを第 2 段階に簡単にコピーできます。
一部のパッケージには、依存関係の大きなツリーがあります。新しい RPM をインストールすると、コンテナーの攻撃対象領域が意図せず増大する可能性があります。インストールされているパッケージのリストを慎重に確認してください。
5.1.3. カスタム ENTRYPOINT シェルスクリプト リンクのコピーリンクがクリップボードにコピーされました!
カスタムエントリーポイントスクリプトを使用する場合は、正常なシャットダウンに不可欠な終了シグナルを受信するために、Red Hat build of Keycloak を exec
で起動します。
ENTRYPOINT シェルスクリプトの正しいアプローチ
exec
を使用しない場合、シェルスクリプトはコンテナー内で PID 1 のままとなり、SIGTERM
などのシグナルが Red Hat build of Keycloak に到達するのをブロックします。これにより、正常なシャットダウンが妨げられ、キャッシュの不整合やデータの損失が発生する可能性があります。
5.1.4. コンテナーイメージのビルド リンクのコピーリンクがクリップボードにコピーされました!
実際のコンテナーイメージをビルドするには、Containerfile を含むディレクトリーから次のコマンドを実行します。
podman build . -t mykeycloak
podman build . -t mykeycloak
Podman はイメージの作成またはカスタマイズにのみ使用できます。実稼働環境での Red Hat build of Keycloak の実行に Podman はサポートされていません。
5.1.5. 最適化された Red Hat build of Keycloak コンテナーイメージの起動 リンクのコピーリンクがクリップボードにコピーされました!
イメージを起動するには、以下を実行します。
podman run --name mykeycloak -p 8443:8443 -p 9000:9000 \ -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=change_me \ mykeycloak \ start --optimized --hostname=localhost
podman run --name mykeycloak -p 8443:8443 -p 9000:9000 \
-e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=change_me \
mykeycloak \
start --optimized --hostname=localhost
Red Hat build of Keycloak は、セキュアな HTTPS 通信のみを使用して実稼働モードで開始され、https://localhost:8443
で使用できます。
ヘルスチェックエンドポイントは、https://localhost:9000/health
、https://localhost:9000/health/ready
、https://localhost:9000/health/live
で使用できます。
https://localhost:9000/metrics
を開くと、モニタリングソリューションで使用できる運用メトリクスを含むページが表示されます。
5.1.6. Docker の既知の問題 リンクのコピーリンクがクリップボードにコピーされました!
-
RUN dnf install
コマンドに時間がかかり過ぎていると思われる場合は、Docker systemd サービスのファイル制限LimitNOFILE
が正しく設定されていない可能性があります。適切な値 (1024000 など) を使用するようにサービス設定を更新するか、RUN コマンドでulimit
を直接使用してください。
... RUN ulimit -n 1024000 && dnf install --installroot ... ...
...
RUN ulimit -n 1024000 && dnf install --installroot ...
...
-
プロバイダー JAR が含まれており、プロバイダー JAR が変更されたという通知が表示されてコンテナーが
start --optimized
に失敗する場合、Docker がファイル変更タイムスタンプを切り捨てたか、build
コマンドで記録された内容から実行時に表示される内容に変更したことが失敗の原因です。その場合は、build
を実行する前に、touch
コマンドを使用して選択した既知のタイムスタンプをイメージが使用するように強制する必要があります。