本遷移範例使用 Spring Music 專案,說明如何將 Cloud Foundry 應用程式建構為符合 OCI 規範的應用程式映像檔。本範例採用遷移策略,使用 Cloud Foundry 生態系統的開放原始碼元件。建立應用程式映像檔後,您需要設定應用程式,才能部署至 Cloud Run。
事前準備
- 請確認您已按照設定頁面所述,為 Cloud Run 設定新專案。
- 請確認您有
REGISTRY_URI
可儲存容器。Cloud Run 建議使用 Artifact Registry。 - 在工作站上安裝 Docker。Docker 用於建立中間映像檔,以建構專案。
部署時需要的權限
在本指南中,您需要建構、儲存建構的容器映像檔及部署的權限。
您必須具備下列角色:
專案結構
在本指南中,我們建議您建立專案目錄 (例如 cr-spring-music/
),並在逐步完成指南內容時建立子目錄。
cr-spring-music/
├── build
├── run
└── spring-music
建立建構映像檔
本節會使用 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 建構 Spring Music
如要複製 Spring Music 專案並執行建構指令,就像要將專案部署至 Cloud Foundry 一樣,請按照下列步驟操作:
複製 Spring Music 存放區:
git clone https://github.com/cloudfoundry-samples/spring-music.git
在本指南中,我們將使用舊版的 Spring Music 應用程式,該應用程式使用 Java 8 和 Spring Boot 2。為此,我們將移至 Spring Music 專案的舊版修訂版本:
git checkout 610ba471a643a20dee7a62d88a7879f13a21d6a3
移至存放區:
cd spring-music
建構 Spring Music 二進位檔:
./gradlew clean assemble
現在您有一個 build/
資料夾,其中包含已編譯的 Spring Music 應用程式,可推送到 Cloud Foundry 例項。
將 Spring Music 轉換為與 Cloud Run 相容的應用程式
您必須使用建構指令的輸出內容,準備將 Spring Music 構件部署至 Cloud Run。
建立暫存目錄
cr-app
,並在其中建立src
子目錄:mkdir -p cr-app/src
將編譯後的 JAR 內容解壓縮至
src
目錄,模擬cf push
:unzip build/libs/spring-music-1.0.jar -d cr-app/src
將目錄變更為
cr-app/
:cd cr-app/
建立名為
Dockerfile
的新檔案。這項Dockerfile
會使用先前步驟中建立的建構映像檔和執行階段映像檔,透過 Java 建構套件為 Spring Music 建立可執行的應用程式映像檔。將下列程式碼貼入
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
以符合 OCI 規範的映像檔形式建構 Spring Music
在這個步驟中,您將指示 Cloud Build 如何使用上一步建立的建構映像檔、執行階段映像檔和應用程式 Dockerfile,建構符合 OCI 規範的映像檔。
如要建立符合 OCI 規範的映像檔,請按照下列步驟操作:
建立名為
cloudbuild.yaml
的檔案。這是建構設定,可指示 Cloud Build 如何建構應用程式。將下列設定貼到
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: REGISTRY_URI/builder:stable _RUN_IMAGE: REGISTRY_URI/runtime:stable _BUILDPACKS: https://github.com/cloudfoundry/java-buildpack _TAG: REGISTRY_URI/spring-music:latest
- 將
REGISTRY_URI
替換為您發布建構工具和執行程式的容器登錄 URI。
- 將
使用 Cloud Build 建構應用程式映像檔:
gcloud builds submit .
建構完成後,請記下產生的映像檔 URI。您會在後續步驟中部署應用程式時用到。建構完成的映像檔會是符合 OCI 標準的容器映像檔,可用於執行 Spring Music 應用程式,並以開放原始碼 Cloud Foundry 元件建構而成。
部署至 Cloud Run
您必須建立服務定義檔,才能在 Cloud Run 中使用:
為應用程式建立服務帳戶:
gcloud iam service-accounts create spring-music
建立
service.yaml
檔案並加入以下程式碼:apiVersion: serving.knative.dev/v1 kind: Service metadata: name: "spring-music" # Set this to be the project number of the project you're deploying to. namespace: "PROJECT_NUMBER" labels: cloud.googleapis.com/location: us-central1 migrated-from: cloud-foundry annotations: run.googleapis.com/ingress: all spec: template: metadata: annotations: autoscaling.knative.dev/minScale: '1' autoscaling.knative.dev/maxScale: '1' run.googleapis.com/cpu-throttling: 'true' run.googleapis.com/startup-cpu-boost: 'true' run.googleapis.com/sessionAffinity: 'false' spec: containerConcurrency: 1000 timeoutSeconds: 900 serviceAccountName: spring-music@PROJECT_NUMBER.iam.gserviceaccount.com containers: - name: user-container # Set the following value to either: # - The image you built for your application in the last section of the guide. image: SPRING_IMAGE_URI ports: - name: http1 containerPort: 8080 env: - name: VCAP_APPLICATION value: |- { "application_id": "00000000-0000-0000-0000-000000000000", "application_name": "spring-music", "application_uris": [], "limits": { "disk": 0, "mem": 1024 }, "name": "spring-music", "process_id": "00000000-0000-0000-0000-000000000000", "process_type": "web", "space_name": "none", "uris": [] } - name: MEMORY_LIMIT value: '1024M' resources: limits: memory: 1024Mi cpu: "1" startupProbe: httpGet: path: / port: 8080 timeoutSeconds: 1 failureThreshold: 30 successThreshold: 1 periodSeconds: 2 livenessProbe: httpGet: path: / port: 8080 timeoutSeconds: 1 failureThreshold: 1 successThreshold: 1 periodSeconds: 30 traffic: - percent: 100 latestRevision: true
- 將
PROJECT_NUMBER
替換為專案編號。 - 將
SPRING_IMAGE_URI
替換為在「將 Spring Music 建構為符合 OCI 規範的映像檔」中建立的應用程式映像檔 URI。
- 將
將服務部署至 Cloud Run:
gcloud run services replace service.yaml
部署完成後,您就能在部署網址存取執行中的 Spring Music 應用程式。
後續步驟
- 如要深入瞭解容器化程序,請參閱「遷移至 OCI 容器」。