6.3. RHEL コンテナーツールでの再現性の実現
Buildah、Podman、Skopeo などの RHEL コンテナーツールを使用してビルドの再現性を実現することで、ビルドプロセス中のタイムスタンプやその他の非決定的な要素を制御できます。
RHEL コンテナーツールは、再現性を確保するために、標準化されたデーモンレスのスクリプト制御可能なワークフローを提供します。このアプローチにより、一度ビルドしたコンテナーをどこでも一貫して実行できることが保証され、依存関係、環境、バージョン管理に関する潜在的な問題に対処できます。
- Buildah
- RHEL Buildah は、ビルドプロセスをきめ細かく制御することで、再現可能なコンテナービルドを実現します。不安定なタグ、ファイルシステムのメタデータ、ホスト依存データなどの非決定性の原因を軽減するための特別なオプションを備えています。Buildah は、再現可能なビルドのために固定タイムスタンプを使用します。
標準のタイムスタンプは、再現性を大幅に低下させます。デフォルトでは、ファイルの作成時刻と変更時刻は、ファイルがコンテナーレイヤーに追加された時点を反映します。Buildah を使用すると、このタイムスタンプをゼロにしたり、特定の固定値に設定したりできます。再現性を確保するために、以下のオプションを使用できます。
+
-
--rewrite-timestamp: このオプションは、レイヤーの内容に--source-date-epochより後の日付ではないタイムスタンプを付けます。また、主に決定論的なビルドを実現する目的で、イメージの作成タイムスタンプとそのレイヤー内ファイルのタイムスタンプを制御します。 -
--source-date-epoch: このオプションは、以前の--timestampオプションよりも柔軟性が高く、イメージレイヤー内のすべてのファイルに対して、特定の再現可能なタイムスタンプを定義できます。これは、イメージメタデータの作成日と履歴の日付に影響します。CLI フラグ、環境変数、またはビルド引数を使用して設定できます。フラグを設定すると、宣言された ARG がRUN命令の環境で公開され、静的ホスト名が取得されます。また、コミットされたイメージ内のコンテナー ID フィールドがクリアされます。
- Podman
podman buildコマンドは、ユーザー向けのインターフェイスですが、実際のイメージ作成処理は Buildah ライブラリーに任せています。Podman は Buildah と同じコア機能を活用しているため、再現性のあるコンテナービルドを実現できます。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 のコンテンツが変更された場合は、命令の内容が変わる可能性があります。