6.3. RHEL コンテナーツールでの再現性の実現
RHEL コンテナーツールは、Buildah、Podman、Skopeo などのツール群を使用して、標準化されたデーモンレスのスクリプト制御可能なワークフローを提供し、再現性を実現します。このアプローチにより、一度ビルドしたコンテナーをどこでも一貫して実行できることが保証され、依存関係、環境、バージョン管理に関する潜在的な問題に対処できます。
Buildah:
RHEL Buildah は、ビルドプロセスをきめ細かく制御することで、再現可能なコンテナービルドを実現します。不安定なタグ、ファイルシステムのメタデータ、ホスト依存データなどの非決定性の原因を軽減するための特別なオプションを備えています。再現可能なビルドに関する Buildah の機能は次のとおりです。
固定タイムスタンプ: タイムスタンプは再現性を大幅に低下させます。デフォルトでは、ファイルの作成日時や変更日時は、誰かがコンテナーのレイヤーにファイルを追加した時点を表します。しかし、これは二度と同じになることはありません。Buildah を使用すると、このタイムスタンプをゼロにしたり、特定の固定値に設定したりできます。
-
-–rewrite-timestamp: このオプションは、レイヤーの内容に、--source-date-epochより後の時刻のタイムスタンプを設定します。また、主に決定論的なビルドを実現する目的で、イメージの作成タイムスタンプとそのレイヤー内ファイルのタイムスタンプを制御します。 -
--source-date-epoch: このオプションは、以前の--timestampオプションよりも柔軟性が高く、イメージレイヤー内のすべてのファイルに対して特定の再現可能なタイムスタンプを定義できます。これは、イメージメタデータの作成日と履歴の日付に影響します。このオプションは、CLI のフラグ、環境変数、またはビルド引数を使用して設定できます。フラグを設定すると、宣言された ARG がRUN命令の環境で公開され、静的ホスト名が取得されます。また、コミットされたイメージ内のコンテナー ID フィールドがクリアされます。
-
Podman:
podman build コマンドは、ユーザー向けのインターフェイスですが、実際のイメージ作成処理は Buildah ライブラリーに任せています。これにより、Podman は Buildah と同じコア機能を活用し、ビルドプロセス中の非決定的な要因を制御することに重点を置くことで、再現可能なコンテナービルドを実現しています。
Podman のコマンドは、-–rewrite-timestamp および --source-date-epoch オプションも受け取ります。また、ローカルキャッシュを無視して新規ビルドを実行するよう Podman に指示する --no-cache オプションもあります。このオプションは、コンテナーイメージをゼロから確実に再生成できることを検証するのに役立ちます。
Skopeo:
Skopeo は、変更可能なタグの代わりに変更不可能なイメージダイジェストを参照することで、再現可能なコンテナービルドを実現します。Skopeo は主にイメージの転送と管理を行います。Buildah などの他のツールが実際の再現可能なイメージの作成を処理します。
--source-date-epoch および --rewrite-timestamp オプションを使用すると、ビルドの再現性が向上します。ただし、完全な再現性は保証されません。COPY 命令の --from オプションを使用して他のイメージから追加されたコンテンツ、RUN 命令の --mount=from= オプションを介してアクセスされたコンテンツ、または ADD 命令を使用してダウンロードされたコンテンツは、参照されているイメージタグが後で移動された場合や、指定された URL にあるコンテンツが変更された場合、変わってしまう可能性があります。