您可以使用 Google Cloud 的 Buildpack 构建为 Cloud Run functions 编写的函数。
本页面介绍了两种方法来构建函数以部署到 Cloud Run 中:
- 使用
pack
CLI - 使用 Cloud Build 作为远程构建系统
函数入口点
如需使用 Buildpack 构建函数,请执行以下操作:
添加 Functions 框架库。
将
GOOGLE_FUNCTION_TARGET
环境变量设置为用作入口点的函数的名称。为此,您可以在源代码所在的文件夹中添加project.toml
。project.toml
文件必须具有以下配置:
[[build.env]]
name = "GOOGLE_FUNCTION_TARGET"
value = "ENTRY_POINT"
将 ENTRY_POINT 替换为函数方法。
如需详细了解如何将环境变量与 Cloud Run functions 搭配使用,请参阅配置 Cloud Run functions 服务。
构建器
函数是基于在 Google Cloud 的 Buildpack 下维护和发布的基础映像而构建的。
构建器是由 Buildpack 和操作系统软件包(也称为堆栈)组成的映像。构建器用于将函数的源代码转换为正在运行的容器。
您可以从受支持的 Google Cloud Buildpack 构建器列表中进行选择。
使用 pack
进行构建
Pack 是由 CNB 项目维护的 CLI 工具,用于为 Buildpack 的使用提供支持。使用 pack
CLI 可在本地将函数构建到容器映像中。
准备工作
- 在工作站上安装 Docker 社区版 (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 作为存储和部署每个映像的容器仓库。
准备工作
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Build and Artifact Registry APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Build and Artifact Registry APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
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 Cloud 项目的位置或最接近该位置的位置。 - 将
DESCRIPTION
替换为您选择的说明。
例如,如需在
us-west2
中创建具有说明“Docker 仓库”的docker
仓库,请运行以下命令: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
替换为您的 Google Cloud 项目的 ID。 - 将
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 images: - LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME
您需要进行如下替换:
- 将
LOCATION
替换为容器仓库的区域名称,例如us-west2
。 - 将
PROJECT_ID
替换为您的 Google Cloud 项目的 ID。 - 将
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
替换为您的 Google Cloud 项目的 ID。 - 将
REPO_NAME
替换为 Docker 仓库的名称。
- 将
-
验证示例函数是否已成功发布到
REPO_NAME
:gcloud artifacts docker images list LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME
您需要进行如下替换:
- 将
LOCATION
替换为容器仓库的区域名称,例如us-west2
。 - 将
PROJECT_ID
替换为您的 Google Cloud 项目的 ID。 - 将
REPO_NAME
替换为 Docker 仓库的名称。
- 将
构建用于自动更新基础映像的函数
函数容器也可以基于 scratch
构建,以便与 Cloud Run 自动安全更新结合使用。
pack
CLI
pack build IMAGE_NAME \
--builder LOCATION.pkg.dev/serverless-runtimes/google-22-full/builder/LANGUAGE:latest
--run-image LOCATION-docker.pkg.dev/serverless-runtimes/google-22/scratch/RUNTIME_ID:latest
您需要进行如下替换:
- 将
LOCATION
替换为容器仓库的区域名称,例如us-west2
。 - 将
IMAGE_NAME
替换为容器映像的名称。 - 将
LANGUAGE
替换为函数的语言,例如nodejs
。 - 将
RUNTIME_ID
替换为运行时 ID,例如nodejs22
。
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-22-full/builder/LANGUAGE:latest
- --run-image
- LOCATION-docker.pkg.dev/serverless-runtimes/google-22/scratch/RUNTIME_ID:latest
- --network
- cloudbuild
images:
- LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME
您需要进行如下替换:
- 将
LOCATION
替换为容器仓库的区域名称,例如us-west2
。 - 将
PROJECT_ID
替换为您的 Google Cloud 项目的 ID。 - 将
REPO_NAME
替换为 Docker 仓库的名称。 - 将
IMAGE_NAME
替换为容器映像的名称。 - 将
LANGUAGE
替换为函数的语言,例如nodejs
。 - 将
RUNTIME_ID
替换为运行时 ID,例如nodejs22
。
后续步骤
- 构建容器后,在将容器部署到 Cloud Run 之前,您可以先在本地进行测试:如需了解详情,请参阅在本地测试 Cloud Run 服务。
- 如需了解 Cloud Run 中容器的主要要求和行为,请参阅容器合同。
- 如需将构建的容器部署到 Cloud Run,请按照部署服务中的说明操作。
- 如需使用 Cloud Build 触发器实现 Cloud Run 服务的自动构建和部署,请设置持续部署。
- 如需为 Java 应用执行最佳容器构建,请参阅使用 Jib 构建 Java 容器。