このページでは、OCI 互換のアプリケーション イメージを生成しながら、Cloud Foundry のビルドプロセスを再現するために必要なビルド インフラストラクチャについて説明します。Spring Music 移行ガイドをすでに完了している場合は、このガイドを使用して、アプリケーションの特定の移行構成を詳しく調べることができます。
始める前に
- Cloud Run の設定ページの説明に従って、Cloud Run に新しいプロジェクトが設定されていることを確認します。
- データを保存するコンテナ用の
REGISTRY_URI
があることを確認します。Cloud Run では、Artifact Registry の使用を推奨します。Docker を使用して、プロジェクトをビルドするための中間イメージを作成します。
Cloud Foundry 互換のビルドプロセスの設定
この新しいプロセスをサポートするには、2 つのベース OCI コンテナを作成する必要があります。
- Cloud Foundry のビルドプロセスをミラーリングし、アプリケーションのソースコードから Cloud Foundry の Droplet を作成できるビルダー イメージ。
- Cloud Foundry アプリケーション ランタイムをミラーリングするランタイム イメージ。
このプロセスは、プラットフォーム管理者によって少なくとも 1 回は実行される必要があります。プロセスが確立されると、Cloud Run に移行する必要があるすべての Cloud Foundry アプリケーションでビルドと実行のイメージを共有できます。
ビルダー イメージを作成する
このセクションでは、cflinux3
をベースイメージとして使用して、ビルドイメージを作成します。ビルドイメージは、アプリケーション イメージを作成するためのビルド環境として使用されます。
build/
という名前のディレクトリを作成し、その中にcd
を作成します。mkdir build && cd build
build/
フォルダにDockerfile
という新しいファイルを作成し、次のコードを貼り付けます。ARG CF_LINUX_FS=cloudfoundry/cflinuxfs3 FROM golang:1.20-bullseye AS builder_build WORKDIR /build RUN ["git", "clone", "--depth=1", "https://github.com/cloudfoundry/buildpackapplifecycle.git"] WORKDIR /build/buildpackapplifecycle RUN ["go", "mod", "init", "code.cloudfoundry.org/buildpackapplifecycle"] RUN ["go", "mod", "tidy"] RUN CGO_ENABLD=0 go build -o /builder ./builder/ FROM $CF_LINUX_FS # Set up container tools related to building applications WORKDIR /lifecycle COPY --from=builder_build /builder /lifecycle/builder # Set up environment to match Cloud Foundry's build. # https://docs.cloudfoundry.org/devguide/deploy-apps/environment-variable.html#app-system-env WORKDIR /staging/app WORKDIR /tmp ENV CF_INSTANCE_ADDR=127.0.0.1:8080 \ CF_INSTANCE_IP=127.0.0.1 \ CF_INSTANCE_INTERNAL_IP=127.0.0.1 \ VCAP_APP_HOST=127.0.0.1 \ CF_INSTANCE_PORT=8080 \ LANG=en_US.UTF-8 \ INSTANCE_GUID=00000000-0000-0000-0000-000000000000 \ VCAP_APPLICATION={} \ VCAP_SERVICES={} \ CF_STACK=cflinuxfs3
Cloud Build を使用して
builder
イメージをビルドして公開します。gcloud builds \ submit --tag "REGISTRY_URI/builder:stable"
REGISTRY_URI
は、ビルドイメージを公開する Artifact Registry のアドレスに置き換えます。例:REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/builder:stable
。
ランタイム イメージを作成する
このセクションでは、cflinux3
をベースイメージとして使用して、実行イメージを作成します。実行イメージは、最終的なアプリイメージを作成するときにベースイメージとして使用されます。
run/
という名前のディレクトリを作成し、その中にcd
を作成します。mkdir run && cd run
run/
フォルダ内に、次のコードを含むentrypoint.bash
という名前の新しいシェル スクリプトを作成します。#!/usr/bin/env bash set -e if [[ "$@" == "" ]]; then exec /lifecycle/launcher "/home/vcap/app" "" "" else exec /lifecycle/launcher "/home/vcap/app" "$@" "" fi
run/
フォルダにDockerfile
という新しいファイルを作成し、次のコードを貼り付けます。ARG CF_LINUX_FS=cloudfoundry/cflinuxfs3 FROM golang:1.20-bullseye AS launcher_build WORKDIR /build RUN ["git", "clone", "--depth=1", "https://github.com/cloudfoundry/buildpackapplifecycle.git"] WORKDIR /build/buildpackapplifecycle RUN ["go", "mod", "init", "code.cloudfoundry.org/buildpackapplifecycle"] RUN ["go", "mod", "tidy"] RUN CGO_ENABLD=0 go build -o /launcher ./launcher/ FROM $CF_LINUX_FS # Set up container tools related to launching the application WORKDIR /lifecycle COPY entrypoint.bash /lifecycle/entrypoint.bash RUN ["chmod", "+rx", "/lifecycle/entrypoint.bash"] COPY --from=launcher_build /launcher /lifecycle/launcher # Set up environment to match Cloud Foundry WORKDIR /home/vcap USER vcap:vcap ENTRYPOINT ["/lifecycle/entrypoint.bash"] # Expose 8080 to allow app to be run on Cloud Foundry, # and PORT so the container can be run locally. # These do nothing on Cloud Run. EXPOSE 8080/tcp # Set up environment variables similar to Cloud Foundry. ENV CF_INSTANCE_ADDR=127.0.0.1:8080 \ CF_INSTANCE_IP=127.0.0.1 \ INSTANCE_IP=127.0.0.1 \ CF_INSTANCE_INTERNAL_IP=127.0.0.1 \ VCAP_APP_HOST=127.0.0.1 \ CF_INSTANCE_PORT=80 \ LANG=en_US.UTF-8 \ CF_INSTANCE_GUID=00000000-0000-0000-0000-000000000000 \ INSTANCE_GUID=00000000-0000-0000-0000-000000000000 \ CF_INSTANCE_INDEX=0 \ INSTANCE_INDEX=0 \ PORT=8080 \ VCAP_APP_PORT=8080 \ VCAP_APPLICATION={} \ VCAP_SERVICES={}
Cloud Build を使用し、
runtime
イメージをビルドして公開します。gcloud builds submit \ --tag "REGISTRY_URI/runtime:stable"
REGISTRY_URI
は、ビルドイメージを公開する Artifact Registry のアドレスに置き換えます。例:REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/runtime:stable.
Cloud Foundry アプリケーションを OCI イメージとしてビルドする
Cloud Run に移行するアプリケーションには、Cloud Foundry がアプリケーションを実行する方法に合わせた独自の Dockerfile が必要です。Dockerfile は次のことを行います。
- ビルダー イメージを読み込みます。
- v2 Buildpack ライフサイクルを実行して Droplet を作成します。
- Droplet の内容を抽出します。
- 実行イメージに Droplet の内容を読み込み、実行可能なアプリケーション イメージを作成します。
最終的なアプリケーション イメージは、Cloud Foundry と Cloud Run の両方と互換性があるため、移行の A/B テストを実施して予期しない動作をデバッグできます。
このプロセスは、移行する必要があるアプリケーションごとにアプリケーション チームが行う必要があります。
デプロイされた Cloud Foundry アプリケーションからビルド情報を収集する
アプリケーション スタックを確認します。スタックは、
cf push
の-s
フラグか、アプリケーション マニフェストのstack
フィールドに指定されています。- スタックが Windows の場合、アプリケーションは Cloud Run と互換性がない可能性があります。続行する前に、アプリケーションを Linux に移植してください。
- スタックが空白、
cflinuxfs3
、またはcflinuxfs4
の場合、アプリケーションは Cloud Run に移行できます。
アプリケーションの Buildpack のリストを収集します。Buildpack は、
cf push
の-b
フラグ、アプリケーション マニフェストのbuildpack
フィールド、またはアプリケーション マニフェストのbuildpacks
フィールドに指定されています。- Buildpack が指定されていない場合は、自動検出されていることを意味します。Cloud Foundry の最新のアプリケーション デプロイで検出された Buildpack のリストを確認します。パスがわかっている場合は明示的に指定します。
- Buildpack が URL の場合は、URL をメモして次のステップに進みます。
略称を使用する Buildpack の場合は、次の表で対応する URL を確認してください。
略称 URL staticfile_buildpack
https://github.com/cloudfoundry/staticfile-buildpack java_buildpack
https://github.com/cloudfoundry/java-buildpack ruby_buildpack
https://github.com/cloudfoundry/ruby-buildpack dotnet_core_buildpack
https://github.com/cloudfoundry/dotnet-core-buildpack nodejs_buildpack
https://github.com/cloudfoundry/nodejs-buildpack go_buildpack
https://github.com/cloudfoundry/go-buildpack python_buildpack
https://github.com/cloudfoundry/python-buildpack php_buildpack
https://github.com/cloudfoundry/php-buildpack binary_buildpack
https://github.com/cloudfoundry/binary-buildpack nginx_buildpack
https://github.com/cloudfoundry/nginx-buildpack あまり一般的でない Buildpack のソースは、Cloud Foundry GitHub 組織で見つかる場合があります。
イメージのソースコードの場所を収集します。ソースは、アプリ マニフェストの
path
属性またはcf push
コマンドの-p
フラグで指定されています。ソースが定義されていない場合は、現在のディレクトリが参照されます。ソースコード ディレクトリに
.cfignore
ファイルがあるかどうかを確認します。存在する場合は、.gcloudignore.
という名前のファイルに移動します。
Cloud Foundry アプリケーションをビルドする
このステップでは、ビルド要素を次のフォルダ構造に整理します。
.
├── cloudbuild.yaml
├── Dockerfile
├── .gcloudignore
└── src
├── go.mod
└── main.go
cloudbuild.yaml
は、特定のビルド手順を Cloud Build に提供します。Dockerfile
は、前の手順で示したビルドイメージと実行イメージを使用して、アプリケーション イメージを作成します。src/
にはアプリケーションのソースコードが含まれます。
このディレクトリに、次の内容のファイルを
Dockerfile
という名前で作成します。ARG BUILD_IMAGE ARG RUN_IMAGE FROM $BUILD_IMAGE as build COPY src /staging/app COPY src /tmp/app ARG BUILDPACKS RUN /lifecycle/builder \ -buildArtifactsCacheDir=/tmp/cache \ -buildDir=/tmp/app \ -buildpacksDir=/tmp/buildpacks \ -outputBuildArtifactsCache=/tmp/output-cache \ -outputDroplet=/tmp/droplet \ -outputMetadata=/tmp/result.json \ "-buildpackOrder=${BUILDPACKS}" \ "-skipDetect=true" FROM $RUN_IMAGE COPY --from=build /tmp/droplet droplet RUN tar -xzf droplet && rm droplet
このディレクトリに、次の内容のファイルを
cloudbuild.yaml
という名前で作成します。steps: - name: gcr.io/cloud-builders/docker args: - 'build' - '--network' - 'cloudbuild' - '--tag' - '${_TAG}' - '--build-arg' - 'BUILD_IMAGE=${_BUILD_IMAGE}' - '--build-arg' - 'RUN_IMAGE=${_RUN_IMAGE}' - '--build-arg' - 'BUILDPACKS=${_BUILDPACKS}' - '.' images: - "${_TAG}" options: # Substitute build environment variables as an array of KEY=VALUE formatted strings here. env: [] substitutions: _BUILD_IMAGE: BUILD_IMAGE_URI _RUN_IMAGE: RUN_IMAGE_URI _BUILDPACKS: BUILDPACK_URL _TAG: APP_ARTIFACT_REGISTRY/APP_NAME:latest
.cfignore
ファイルがある場合は、.gcloudignore
という名前のディレクトリにコピーします。このディレクトリに
src
という名前のディレクトリを作成します。アプリケーションのコンテンツを
src:
にコピーします。- ソースが ZIP ファイル(
.jar
ファイルを含む)の場合は、コンテンツをsrc
に解凍します。 - ソースコードがディレクトリの場合は、内容を
src
にコピーします。
- ソースが ZIP ファイル(
gcloud builds submit .
を実行してアプリケーションをビルドします。
確認済みの非互換性
- Cloud Foundry で挿入された環境変数(
VCAP_SERVICES
など)に依存する Buildpack は機能しません。代わりに、言語の管理システムを使用して、挿入される要素への依存関係を明示的に宣言する必要があります。 - この方法で生成されたイメージにパッチを適用するには、新しいバージョンのビルドと実行イメージを使用してイメージを再ビルドする必要があります。Cloud Foundry で実行する場合、BOSH stemcells を更新してもアプリケーション イメージには自動的にパッチは適用されません。
- ビルドは Cloud Foundry クラスタとは異なるネットワーク環境で行われます。内部パッケージ ミラーにアクセスできるカスタム Cloud Build プールの設定が必要になる場合があります。