1.4. OCI アーティファクトを使用したビルドの作成
コンテナーイメージをビルドするには、Open Container Initiative (OCI) アーティファクト (スクラッチイメージとも呼ばれる) をソースコードとしてレジストリーに保存します。これらをプルして展開し、ビルドのソースとして使用してください。これらにはソースコードのみが含まれており、実行可能なコンテナーは含まれていません。
前提条件
- OpenShift Container Platform クラスターに Builds for Red Hat OpenShift Operator がインストールされている。
-
ocコマンドラインインターフェイス (CLI) がインストールされている。 -
shpCLI がインストールされている。
手順
Buildリソースを作成して OpenShift Container Platform クラスターに適用します。次の設定例を参照してください。$ oc apply -f - <<EOF apiVersion: shipwright.io/v1beta1 kind: Build metadata: name: <build_resource_name> spec: source: type: OCI ociArtifact: image: <quay.io/org/image:tag> strategy: name: <strategy_name> kind: ClusterBuildStrategy output: image: <target_image_registry/repository/image:tag> pushSecret: <secret_name_for_credentials> EOF各項目の説明:
<build_resource_name>-
ビルドリソースの名前を指定します。 <quay.io/org/image:tag>- OCI アーティファクトのソースイメージの場所を指定します。
< 戦略名 >- コンテナーを構築するためのビルドストラテジーの名前を指定します。
<target_image_registry/repository/image:tag>- ビルドしたイメージをプッシュする場所を指定します。
< 認証情報用の秘密名 >- (オプション) コンテナーイメージをプッシュするための認証情報を格納するシークレット名を指定します。認証用のプライベートレジストリーのシークレットを生成するには、コンテナーレジストリーへの認証を 参照してください。
次のいずれかの方法を選択して、ソースコードを必要なレジストリーにアップロードし、ビルドを実行します。
shpCLI を使用してソースコードをアップロードします。ローカルソースコードを含むディレクトリーで次のコマンドを実行します。ソースコードをスクラッチコンテナーイメージにパッケージ化し、必要なレジストリーにプッシュして、ビルドを実行します。
$ shp build upload <build_resource_name>各項目の説明:
<build_resource_name>-
ビルドリソースの名前を指定します。
OCI アーティファクトを手動でアップロードします。
ソースコードのルートディレクトリーに
Containerfileを作成し、次の設定を追加します。FROM scratch COPY . /ソースコードのルートディレクトリーで次のコマンドを実行し、Podman を使用してコンテナーイメージをビルドします。
$ podman build -t <registry_path>/<image_name>:<tag> .各項目の説明:
< レジストリーパス >- イメージが保存されるレジストリーのビルド場所を指定します。
<image_name>- コンテナーイメージの名前を指定します。
<tag>イメージのタグを指定します。
コンテナーイメージが正常に構築されると、成功メッセージが表示されます。以下のコマンド例と出力結果を参照してください。
podman build -t quay.io/example/oci:latest .STEP 1/2: FROM scratch STEP 2/2: COPY . / --> Using cache 31f2530b092a8e0d75586407052900e9946043eca09deb9a2c9e50c2541bfcfd COMMIT quay.io/example/oci:latest --> 31f2530b092a Successfully tagged quay.io/example/oci:latest 31f2530b092a8e0d75586407052900e9946043eca09deb9a2c9e50c2541bfcfd
次のコマンドを使用して、コンテナーイメージを必要な場所にプッシュします。
$ podman push <registry_path>/<image_name>:<tag>各項目の説明:
< レジストリーパス >- イメージが保存されるレジストリーのビルド場所を指定します。
<image_name>- コンテナーイメージの名前を指定します。
<tag>- イメージのタグを指定します。
次のコマンドを使用してビルドを実行します。
$ shp build run <build_resource_name>各項目の説明:
<build_resource_name>-
ビルドリソースの名前を指定します。
検証
すべてのコンテナーがタスクを完了したら、以下のリソースの状態を確認してください。
Pod で
STATUSフィールドがCompletedとして表示されるかどうかを確認します。$ oc get pods -w出力例:
NAME READY STATUS RESTARTS AGE oci-artifact-buildrun-pxg9w-pod 2/2 Running 0 58s oci-artifact-buildrun-pxg9w-pod 0/2 Completed 0 1m42sそれぞれの
TaskRunリソースにSUCCEEDEDフィールドがTrueと表示されているかどうかを確認します。$ oc get tr出力例:
NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME oci-artifact-buildrun-pxg9w True Succeeded 2m10s 28sそれぞれの
BuildRunリソースにSUCCEEDEDフィールドがTrueと表示されているかどうかを確認します。$ oc get br出力例:
NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME oci-artifact-buildrun True Succeeded 2m12s 30s検証中にビルドの実行が失敗した場合は、
BuildRunリソースのstatus.failureDetailsフィールドをチェックして、Pod またはコンテナー内で失敗が発生した正確なポイントを特定できます。注記コンテナーの 1 つがタスクを完了したため、Pod が
NotReady状態に切り替わる可能性があります。これは想定される動作です。build.spec.output.imageフィールドで指定されたレジストリーにイメージがプッシュされたかどうかを検証します。レジストリーにログインし、以下のコマンドを実行してイメージをプルします。$ podman manifest inspect image-registry.openshift-image-registry.svc:5000/oci-artifacts-example/taxi-app前の例では、プロジェクト名は
oci- アーティファクト s-example、イメージ名はtaxi- アプリケーションです。出力例:
"schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "manifests": [ { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 594, "digest": "sha256:6a05100e302c86c03fec6277f4b3107f1fdde6c69d3ca9a4207e4735a5213e32", "platform": { "architecture": "amd64", "os": "linux" } ]