使用 Buildpack 构建函数

本指南介绍如何将 Buildpack 与函数源代码搭配使用来创建容器映像。例如,使用 Buildpack 构建要在 Cloud Run 上部署的 Cloud Functions 函数。

您可以通过以下两种方法使用 Buildpack 构建容器映像:

  • 使用 pack CLI 在本地构建,以便在本地测试您的函数并在部署前快速对更改进行原型设计。
  • 使用 Cloud Build 远程构建。使用 Cloud Build 进行构建适合具有资源密集型构建流程的函数,还有助于保护您的软件供应链

配置项目以构建函数

如需使用 buildpack 构建函数,请使用 Functions 框架库。您必须将 GOOGLE_FUNCTION_TARGET 环境变量设置为您用作入口点的函数的名称。如需详细了解如何将环境变量与 Cloud Functions 函数搭配使用,请参阅配置 Cloud Functions 函数服务

本地构建

使用 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. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 Cloud Build and Artifact Registry API。

    启用 API

  5. 安装 Google Cloud CLI。
  6. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  7. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  8. 确保您的 Google Cloud 项目已启用结算功能

  9. 启用 Cloud Build and Artifact Registry API。

    启用 API

  10. 安装 Google Cloud CLI。
  11. 如需初始化 gcloud CLI,请运行以下命令:

    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. 创建一个 YAML 文件名 cloudbuild.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
    

    您需要在其中:

    • LOCATION 替换为容器仓库的区域名称。示例:us-west2
    • PROJECT_ID 替换为您的 Google Cloud 项目的 ID。
    • REPO_NAME 替换为您的 Docker 代码库的名称。
    • IMAGE_NAME 替换为容器映像的名称。
  2. 构建应用。

    如果您将配置文件命名为 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 代码库的名称。

后续步骤