构建函数

您可以使用 Google Cloud 的 Buildpack 构建为 Cloud Run functions 编写的函数。

本页面介绍了两种方法来构建函数以部署到 Cloud Run 中:

  • 使用 pack CLI
  • 使用 Cloud Build 作为远程构建系统

函数入口点

如需使用 Buildpack 构建函数,请执行以下操作:

  • 添加 Functions 框架库。

  • GOOGLE_FUNCTION_TARGET 环境变量设置为用作入口点的函数的名称。为此,您可以在源代码所在的文件夹中添加 project.tomlproject.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 可在本地将函数构建到容器映像中。

准备工作

  1. 在工作站上安装 Docker 社区版 (CE)pack 会将 Docker 用作 OCI 映像构建器。
  2. 安装 Pack CLI
  3. 安装 Git 源代码控制工具以从 GitHub 获取示例应用。

在本地构建函数

您可以使用 pack build 命令并指定默认构建器 --builder=gcr.io/buildpacks/builder,以在本地构建容器映像。

pack build --builder=gcr.io/buildpacks/builder IMAGE_NAME

IMAGE_NAME 替换为容器映像的名称。

您还可以通过扩展构建来自定义容器映像并运行映像

在本地构建示例函数

以下示例演示了如何在本地构建示例。

  1. 将示例代码库克隆到本地计算机:
    git clone https://github.com/GoogleCloudPlatform/buildpack-samples.git
  2. 切换到包含应用示例代码的目录:

    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
  3. 使用 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
  4. 使用 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
  5. 通过浏览到 localhost:8080 来访问正在运行的函数。

使用远程构建系统进行构建

使用 Cloud Build 可将函数构建到容器映像中,并使用 Artifact Registry 作为存储和部署每个映像的容器仓库。

准备工作

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Build and Artifact Registry APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Cloud Build and Artifact Registry APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. 确保您的 Google Cloud 项目有权访问容器映像仓库。

    如需配置对 Artifact Registry 中的 Docker 仓库的访问权限,请执行以下操作:

    1. 在 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"
    2. 验证您的代码库已创建:
      gcloud artifacts repositories list

      您应该会在列表中看到您为 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 的构建步骤。

  1. 创建一个名为 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 替换为容器映像的名称。
  1. 构建应用。

    如果您将配置文件命名为 cloudbuild.yaml,则可以运行以下命令:

    gcloud builds submit .
    

示例:远程构建示例函数

以下示例演示了如何远程构建示例,并验证容器映像是否已推送到 Artifact Registry 中的仓库。

  1. 将示例代码库克隆到本地计算机:
    git clone https://github.com/GoogleCloudPlatform/buildpack-samples.git
  2. 切换到包含应用示例代码的目录:

    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
  3. 使用 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 仓库的名称。

  4. 验证示例函数是否已成功发布到 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 容器