Cloud Run 支援直接部署函式,但您也可以使用 Google Cloud 的 Buildpacks 將函式建構為容器映像檔,然後將這個容器映像檔部署至 Cloud Run。
將函式建構到容器中的常見用途包括:
- 持續整合與持續推送軟體更新:開發人員編寫函式程式碼並推送至來源存放區後,CI/CD 系統會自動將函式建構至容器中、執行測試,並自動部署至暫存環境。
- 基礎架構即程式碼:使用 YAML 或 Terraform 管理的 Cloud Run 資源會參照容器映像檔網址。開發人員編寫的函式程式碼必須建構為容器映像檔。
本頁詳細說明如何使用兩種方式,複製 Cloud Run 函式的確切建構程序:
- 使用
packCLI - 使用 Cloud Build 做為遠端建構系統
函式進入點
如要使用 buildpack 建構函式,請按照下列步驟操作:
加入 Functions Framework 程式庫。
將
GOOGLE_FUNCTION_TARGET環境變數設為您用來做為進入點的函式名稱。如要這麼做,請在原始碼所在的資料夾中加入project.toml。project.toml檔案必須包含下列設定:
[[build.env]]
name = "GOOGLE_FUNCTION_TARGET"
value = "ENTRY_POINT"
將 ENTRY_POINT 替換為函式方法。
如要進一步瞭解如何搭配使用環境變數和 Cloud Run functions,請參閱「設定 Cloud Run functions 服務」。
建構工具
Cloud Run functions 是以 Google Cloud 的 Buildpacks 維護及發布的基礎映像檔為基礎建構而成。
建構工具是包含建構包和作業系統套件 (也稱為堆疊) 的映像檔。建構工具用於將函式的原始碼轉換為執行中的容器。
您可以從支援的 Google Cloud 建構包建構工具清單中選擇。
使用 pack 建構內容
Pack 是由 CNB 專案維護的 CLI 工具,支援使用 Buildpack。使用 pack CLI 將函式建構為容器映像檔。
事前準備
- 在工作站上安裝 Docker Community Edition (CE)。
pack會使用 Docker 做為 OCI 映像檔建構工具。 - 安裝 Pack CLI。
- 安裝 Git 原始碼控管工具,以便從 GitHub 中擷取範例應用程式。
在本機建構函式
您可以使用 pack build 指令並指定預設建構工具 --builder=gcr.io/buildpacks/builder,在本機建構容器映像檔。
pack build --builder=gcr.io/buildpacks/builder IMAGE_NAME
將 IMAGE_NAME 換成容器映像檔名稱。
您也可以擴充建構和執行映像檔,自訂容器映像檔。
在本機建構範例函式
下列範例說明如何在本地建構範例。
- 將範例存放區複製到本機電腦:
git clone https://github.com/GoogleCloudPlatform/buildpack-samples.git
- 變更為包含應用程式範例程式碼的目錄:
Go
cd buildpack-samples/sample-functions-framework-go
Java
cd buildpack-samples/sample-functions-framework-java-mvn
Node.js
cd buildpack-samples/sample-functions-framework-node
Python
cd buildpack-samples/sample-functions-framework-python
Ruby
cd buildpack-samples/sample-functions-framework-ruby
- 使用
pack建構範例函式:Go
pack build --builder=gcr.io/buildpacks/builder sample-functions-framework-go
Java
pack build --builder gcr.io/buildpacks/builder:v1 sample-functions-java-mvn
Node.js
pack build --builder=gcr.io/buildpacks/builder sample-functions-framework-node
Python
pack build --builder=gcr.io/buildpacks/builder sample-functions-framework-python
Ruby
pack build --builder=gcr.io/buildpacks/builder sample-functions-framework-ruby
- 使用
docker執行映像檔:Go
docker run -p8080:8080 sample-functions-framework-go
Java
docker run -it -ePORT=8080 -p8080:8080 sample-functions-java-mvn
Node.js
docker run -it -ePORT=8080 -p8080:8080 sample-functions-framework-node
Python
docker run -it -ePORT=8080 -p8080:8080 sample-functions-framework-python
Ruby
docker run -it -ePORT=8080 -p8080:8080 sample-functions-framework-ruby
- 瀏覽 localhost:8080,即可查看正在執行的函式。
使用遠端建構系統建構
使用 Cloud Build 將函式建構為容器映像檔,並使用 Artifact Registry 做為容器存放區,儲存及部署每個映像檔。
事前準備
- 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Build and Artifact Registry APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
安裝 Google Cloud CLI。
-
若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Build and Artifact Registry APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
安裝 Google Cloud CLI。
-
若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init - 確認 Google Cloud 專案有權存取容器映像檔存放區。
如要設定存取 Artifact Registry 中的 Docker 存放區,請按照下列步驟操作:
- 在 Google Cloud 專案的相同位置建立新的 Docker 存放區。
取代:gcloud artifacts repositories create REPO_NAME \ --repository-format=docker \ --location=REGION --description="DESCRIPTION"
REPO_NAME替換成您為 Docker 存放區選擇的名稱。REGION,其中位置位於專案位置或最接近專案位置。 Google CloudDESCRIPTION,並提供您選擇的說明。
舉例來說,如要在
us-west2中建立docker存放區,並將說明設為「Docker repository」,請執行下列指令:gcloud artifacts repositories create buildpacks-docker-repo --repository-format=docker \ --location=us-west2 --description="Docker repository"
- 確認存放區是否已成功建立:
gcloud artifacts repositories list
清單中應該會顯示您為 Docker 存放區選擇的名稱。
- 在 Google Cloud 專案的相同位置建立新的 Docker 存放區。
遠端建構函式
您可以使用 gcloud builds submit 指令,建構容器映像檔並上傳至存放區。
您可以選擇在指令中指定容器映像檔,也可以使用設定檔。
使用指令建構
如要在沒有設定檔的情況下建構,請指定 image 標記:
gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME
更改項目:
LOCATION為容器存放區的區域名稱,例如us-west2- 將
PROJECT_ID替換為專案 ID。 Google Cloud REPO_NAME替換為 Docker 存放區的名稱。IMAGE_NAME改為您的容器映像檔名稱。
範例:
gcloud builds submit --pack image=us-west2-docker.pkg.dev/my-project-id/my-buildpacks-docker-repo
使用設定檔建構
您可以使用設定檔定義映像檔存放區設定詳細資料。設定檔使用 YAML 檔案格式,且必須包含使用 pack CLI 的建構步驟。
建立名為
cloudbuild.yaml的 YAML 檔案,其中包含容器映像檔存放區的 URI。options: logging: CLOUD_LOGGING_ONLY pool: {} projectId: PROJECT_ID steps: - name: gcr.io/k8s-skaffold/pack entrypoint: pack args: - build - LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME - --builder - gcr.io/buildpacks/builder:latest - --network - cloudbuild - --publish - name: gcr.io/cloud-builders/docker entrypoint: pack args: - pull - LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME images: - LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME更改項目:
- 將
LOCATION換成容器存放區的區域名稱,例如us-west2。 - 將
PROJECT_ID替換為專案 ID。 Google Cloud REPO_NAME替換為 Docker 存放區的名稱。IMAGE_NAME改為您的容器映像檔名稱。
- 將
建構應用程式。
如果您將設定檔命名為
cloudbuild.yaml,請執行下列指令:gcloud builds submit .
範例:從遠端建構範例函式
下列範例示範如何遠端建構範例,並確認容器映像檔已推送至 Artifact Registry 中的存放區。
- 將範例存放區複製到本機電腦:
git clone https://github.com/GoogleCloudPlatform/buildpack-samples.git
- 變更為包含應用程式範例程式碼的目錄:
Go
cd buildpack-samples/sample-functions-framework-go
Java
cd buildpack-samples/sample-functions-framework-java-mvn
Node.js
cd buildpack-samples/sample-functions-framework-node
Python
cd buildpack-samples/sample-functions-framework-python
Ruby
cd buildpack-samples/sample-functions-framework-ruby
- 使用
gcloud將應用程式原始碼提交至 Cloud Build:Go
gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-go
Java
gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-gradle
Node.js
gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-node
Python
gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-python
Ruby
gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-ruby
取代:
LOCATION替換為容器存放區的區域名稱。範例:us-west2-docker.pkg.dev- 將
PROJECT_ID替換為專案 ID。 Google Cloud REPO_NAME替換為 Docker 存放區的名稱。
-
確認範例函式是否已成功發布至
REPO_NAME:gcloud artifacts docker images list LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME
更改項目:
- 將
LOCATION換成容器存放區的區域名稱,例如us-west2。 - 將
PROJECT_ID替換為專案 ID。 Google Cloud REPO_NAME替換為 Docker 存放區的名稱。
- 將
建立函式以自動更新基底映像檔
函式容器也可以在 scratch 上建構,因此可與 Cloud Run 自動安全性更新搭配使用。
Dockerfile
您可以使用現有的建構工具鍊,建立與自動基本映像檔更新相容的函式容器映像檔。如需從頭開始建構容器的操作說明,請參閱這篇文章。
pack CLI
pack build IMAGE_NAME \
--builder LOCATION-docker.pkg.dev/serverless-runtimes/google-24-full/builder/LANGUAGE:latest
--run-image LOCATION-docker.pkg.dev/serverless-runtimes/google-24/scratch/RUNTIME_ID:latest
更改項目:
- 將
LOCATION換成容器存放區的區域名稱,例如us-west2。 IMAGE_NAME改為您的容器映像檔名稱。- 將
LANGUAGE替換為函式語言,例如nodejs。 - 將
RUNTIME_ID替換為執行階段 ID,例如nodejs24。
Cloud Build
options:
logging: CLOUD_LOGGING_ONLY
pool: {}
projectId: PROJECT_ID
steps:
- name: gcr.io/k8s-skaffold/pack
entrypoint: pack
args:
- build
- LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME
- --builder
- LOCATION-docker.pkg.dev/serverless-runtimes/google-24-full/builder/LANGUAGE:latest
- --run-image
- LOCATION-docker.pkg.dev/serverless-runtimes/google-24/scratch/RUNTIME_ID:latest
- --network
- cloudbuild
images:
- LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME
更改項目:
- 將
LOCATION換成容器存放區的區域名稱,例如us-west2。 - 將
PROJECT_ID替換為專案 ID。 Google Cloud REPO_NAME替換為 Docker 存放區的名稱。IMAGE_NAME改為您的容器映像檔名稱。- 將
LANGUAGE替換為函式語言,例如nodejs。 - 將
RUNTIME_ID替換為執行階段 ID,例如nodejs24。
後續步驟
- 將函式建構為容器後,請先在本機測試,再部署至 Cloud Run。詳情請參閱「在本機測試 Cloud Run 服務」。
- 如要將您建構的容器部署到 Cloud Run,請參照部署服務的說明。
- 如要使用 Cloud Build 觸發條件自動執行 Cloud Run 服務的建構和部署作業,請參閱設定持續部署。