OCI コンテナに移行する

このページでは、OCI 互換のアプリケーション イメージを生成しながら、Cloud Foundry のビルドプロセスを再現するために必要なビルド インフラストラクチャについて説明します。Spring Music 移行ガイドをすでに完了している場合は、このガイドを使用して、アプリケーションの特定の移行構成を詳しく調べることができます。

最新のツールを使用して OCI イメージを作成する方法を説明する図

始める前に

  1. Cloud Run の設定ページの説明に従って、Cloud Run に新しいプロジェクトが設定されていることを確認します。
  2. データを保存するコンテナ用の REGISTRY_URI があることを確認します。Cloud Run では、Artifact Registry の使用を推奨します。Docker を使用して、プロジェクトをビルドするための中間イメージを作成します。

Cloud Foundry 互換のビルドプロセスの設定

この新しいプロセスをサポートするには、2 つのベース OCI コンテナを作成する必要があります。

  • Cloud Foundry のビルドプロセスをミラーリングし、アプリケーションのソースコードから Cloud Foundry の Droplet を作成できるビルダー イメージ
  • Cloud Foundry アプリケーション ランタイムをミラーリングするランタイム イメージ

このプロセスは、プラットフォーム管理者によって少なくとも 1 回は実行される必要があります。プロセスが確立されると、Cloud Run に移行する必要があるすべての Cloud Foundry アプリケーションでビルドと実行のイメージを共有できます。

ビルダー イメージを作成する

このセクションでは、cflinux3 をベースイメージとして使用して、ビルドイメージを作成します。ビルドイメージは、アプリケーション イメージを作成するためのビルド環境として使用されます。

  1. build/ という名前のディレクトリを作成し、その中に cd を作成します。

    mkdir build && cd build
    
  2. 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
    
  3. 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 をベースイメージとして使用して、実行イメージを作成します。実行イメージは、最終的なアプリイメージを作成するときにベースイメージとして使用されます。

  1. run/ という名前のディレクトリを作成し、その中に cd を作成します。

    mkdir run && cd run
    
  2. 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
    
  3. 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={}
    
  4. 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 アプリケーションからビルド情報を収集する

  1. アプリケーション スタックを確認します。スタックは、cf push-s フラグか、アプリケーション マニフェストの stack フィールドに指定されています。

    1. スタックが Windows の場合、アプリケーションは Cloud Run と互換性がない可能性があります。続行する前に、アプリケーションを Linux に移植してください。
    2. スタックが空白、cflinuxfs3、または cflinuxfs4 の場合、アプリケーションは Cloud Run に移行できます。
  2. アプリケーションの Buildpack のリストを収集します。Buildpack は、cf push-b フラグ、アプリケーション マニフェストの buildpack フィールド、またはアプリケーション マニフェストの buildpacks フィールドに指定されています。

    1. Buildpack が指定されていない場合は、自動検出されていることを意味します。Cloud Foundry の最新のアプリケーション デプロイで検出された Buildpack のリストを確認します。パスがわかっている場合は明示的に指定します。
    2. Buildpack が URL の場合は、URL をメモして次のステップに進みます。
    3. 略称を使用する 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 組織で見つかる場合があります。

  3. イメージのソースコードの場所を収集します。ソースは、アプリ マニフェストの path 属性または cf push コマンドの -p フラグで指定されています。ソースが定義されていない場合は、現在のディレクトリが参照されます。

  4. ソースコード ディレクトリに .cfignore ファイルがあるかどうかを確認します。存在する場合は、.gcloudignore. という名前のファイルに移動します。

Cloud Foundry アプリケーションをビルドする

このステップでは、ビルド要素を次のフォルダ構造に整理します。

.
├── cloudbuild.yaml
├── Dockerfile
├── .gcloudignore
└── src
    ├── go.mod
    └── main.go
  • cloudbuild.yaml は、特定のビルド手順を Cloud Build に提供します。
  • Dockerfile は、前の手順で示したビルドイメージと実行イメージを使用して、アプリケーション イメージを作成します。
  • src/ にはアプリケーションのソースコードが含まれます。
  1. このディレクトリに、次の内容のファイルを 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
    
  2. このディレクトリに、次の内容のファイルを 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
    
    • BUILD_IMAGE_URI は、前の手順で作成した実行イメージの URI に置き換えます。
    • RUN_IMAGE_URI は、前の手順で作成したビルドイメージの URI に置き換えます。
    • BUILDPACK_URL は、アプリケーションで使用される Buildpack の URL に置き換えます。これは、複数の Buildpack を含むカンマ区切りのリストの場合もあります。
  3. .cfignore ファイルがある場合は、.gcloudignore という名前のディレクトリにコピーします。

  4. このディレクトリに src という名前のディレクトリを作成します。

  5. アプリケーションのコンテンツを src: にコピーします。

    1. ソースが ZIP ファイル(.jar ファイルを含む)の場合は、コンテンツを src に解凍します。
    2. ソースコードがディレクトリの場合は、内容を src にコピーします。
  6. gcloud builds submit . を実行してアプリケーションをビルドします。

確認済みの非互換性

  • Cloud Foundry で挿入された環境変数(VCAP_SERVICES など)に依存する Buildpack は機能しません。代わりに、言語の管理システムを使用して、挿入される要素への依存関係を明示的に宣言する必要があります。
  • この方法で生成されたイメージにパッチを適用するには、新しいバージョンのビルドと実行イメージを使用してイメージを再ビルドする必要があります。Cloud Foundry で実行する場合、BOSH stemcells を更新してもアプリケーション イメージには自動的にパッチは適用されません。
  • ビルドは Cloud Foundry クラスタとは異なるネットワーク環境で行われます。内部パッケージ ミラーにアクセスできるカスタム Cloud Build プールの設定が必要になる場合があります。

次のステップ