构建容器映像

本页面介绍了如何配置 Cloud Build 来构建和存储 Docker 映像。如果您是刚接触 Cloud Build,请先阅读快速入门构建配置概览

Cloud Build 提供了预构建的映像,您可以在 Cloud Build 配置文件中引用这些映像来执行任务。 这些映像由 Google Cloud 支持和维护。您可以使用受支持的预构建 Docker 映像来执行 Docker 命令并构建 Docker 映像。

准备工作

本页面的说明假定您熟悉 Docker。此外:

  • 准备好应用源代码以及 Dockerfile
  • 如果您要使用本页面中的 gcloud 命令,请安装 gcloud 命令行工具
  • 如果您要运行映像,请安装 Docker

使用构建配置文件进行构建

如需使用构建配置文件构建 Docker 映像,请执行以下操作:

  1. 在应用源代码和 Dockerfile 所在的目录中,创建一个名为 cloudbuild.yamlcloudbuild.json 的文件。
  2. 在构建配置文件中:

    • 添加 name 字段并指定预构建的 Docker 映像。预构建的映像存储在 Container Registry 的 gcr.io/cloud-builders/docker 中。在下面的示例配置文件中,name 字段指定 Cloud Build 使用预构建的 Docker 映像来执行 args 字段所指示的任务。
    • args 字段中,添加用于构建映像的参数。

      YAML

      steps:
      - name: 'gcr.io/cloud-builders/docker'
        args: [ 'build', '-t', 'gcr.io/PROJECT_ID/IMAGE_NAME', '.' ]
      

      JSON

      {
       "steps": [
        {
            "name": "gcr.io/cloud-builders/docker",
            "args": [
              "build",
              "-t",
              "gcr.io/PROJECT_ID/IMAGE_NAME",
              "."
             ]
         }
         ]
       }
      

      将上述构建配置中的占位符值替换为以下内容:

      • PROJECT_ID:您的 Cloud 项目 ID。
      • IMAGE_NAME:容器映像的名称。
  3. 使用构建配置文件启动构建:

    gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORY
    

    将上述命令中的占位值替换为以下内容:

    • CONFIG_FILE_PATH:构建配置文件的路径。
    • SOURCE_DIRECTORY:源代码的路径或网址。

    如果您未在 gcloud builds submit 命令中指定 CONFIG_FILE_PATHSOURCE_DIRECTORY,则 Cloud Build 会假定配置文件和源代码位于当前工作目录中。

使用 Dockerfile 进行构建

Cloud Build 允许您仅使用 Dockerfile 构建 Docker 映像。您不需要单独的构建配置文件。

如需使用 Dockerfile 进行构建,请从包含源代码和 Dockerfile 的目录中运行以下命令:

    gcloud builds submit --tag gcr.io/PROJECT_ID/IMAGE_NAME

将上述命令中的占位值替换为以下内容:

  • PROJECT_ID:您的 Cloud 项目 ID。
  • IMAGE_NAME:容器映像的名称。

使用 Cloud Native Buildpacks 进行构建

借助 Cloud Build,您可以在不使用 Dockerfile 或构建配置文件的情况下构建映像。您可以使用 Cloud Native Buildpacks 完成此操作。

如需使用 Buildpack 进行构建,请从包含源代码的目录运行以下命令:

    gcloud builds submit --pack builder=BUILDPACK_BUILDER, \
        env=ENVIRONMENT_VARIABLE, \
        image=IMAGE

将上述命令中的占位值替换为以下内容:

  • BUILDPACK_BUILDER:要使用的 Buildpack 构建器。如果您未指定构建器,Cloud Build 将默认使用 gcr.io/buildpacks/builder
  • ENVIRONMENT_VARIABLE:用于您的构建的任何环境变量。
  • IMAGE:Container Registry 中映像的网址。映像名称必须位于 gcr.io/pkg.dev 命名空间中。

以下是一些示例命令:

  • 使用默认 gcr.io/buildpacks/builder 运行构建以创建映像 gcr.io/gcb-docs-project/hello

      gcloud alpha builds submit --pack image=gcr.io/gcb-docs-project/hello
    
  • 使用 ^--^ 作为分隔符以向您的构建传递多个环境变量。如需详细了解转义参数,请参阅 gcloud topic escaping

      gcloud builds submit --pack \
          ^--^image=gcr.io/my-project/myimage--env=GOOGLE_ENTRYPOINT='java -jar target/myjar.jar',GOOGLE_RUNTIME_VERSION='3.1.301'
    

在 Container Registry 中存储映像

您可以将 Cloud Build 配置为通过以下方式之一存储构建的映像:

  • 使用 images 字段,该字段会在构建完成后将映像存储在 Container Registry 中。
  • 使用 docker push 命令,该命令会作为构建流程的一部分,将映像存储在 Container Registry 中。

使用 images 字段和 Docker push 命令之间的区别在于,如果使用 images 字段,则存储的映像将显示在构建结果中。其中包括构建在 Cloud Console 中的构建说明 (Build description) 页面、Build.get() 的结果和 gcloud builds list 的结果。但是,如果使用 Docker push 命令来存储构建的映像,则映像将不会显示在构建结果中。

如果您希望将存储映像作为构建流程的一部分,并在构建结果中显示映像,请在构建配置文件中同时使用 Docker push 命令和 images 字段。

要在构建完成后将容器映像存储在 Container Registry 中,请执行以下操作:

  1. 在应用源代码和 Dockerfile 所在的目录中,创建一个名为 cloudbuild.yamlcloudbuild.json 的文件。
  2. 在构建配置文件中,添加构建步骤以构建映像,然后添加用于指定构建的映像的 images 字段。这会将映像存储在 Container Registry 中。以下代码段显示了用于构建映像并将其存储在 Container Registry 中的构建配置:

    YAML

    steps:
    - name: 'gcr.io/cloud-builders/docker'
      args: ['build', '-t', 'gcr.io/PROJECT_ID/IMAGE_NAME', '.']
    images: ['gcr.io/PROJECT_ID/IMAGE_NAME']
    

    JSON

    {
    "steps": [
    {
        "name": "gcr.io/PROJECT_ID/IMAGE_NAME",
        "args": [
            "build",
            "-t",
            "gcr.io/PROJECT_ID/IMAGE_NAME",
            "."
        ]
    }
    ],
    "images": [
        "gcr.io/PROJECT_ID/IMAGE_NAME"
    ]
    }
    

    其中:

    • PROJECT_ID 是您的 Cloud 项目 ID。
    • IMAGE_NAME 是容器映像的名称。
  3. 使用构建配置文件启动构建:

    gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORY
    

    其中:

    • CONFIG_FILE_PATH 是构建配置文件的路径。
    • SOURCE_DIRECTORY 是源代码的路径或网址。

如需作为构建流程的一部分将映像存储在 Container Registry 中,请执行以下操作

  1. 在应用源代码和 Dockerfile 所在的目录中,创建一个名为 cloudbuild.yamlcloudbuild.json 的文件。

  2. 在构建配置文件中,添加一个 docker 构建步骤以构建映像,然后添加另一个 docker 构建步骤并传递参数以调用 push 命令:

    YAML

    steps:
    - name: 'gcr.io/cloud-builders/docker'
      args: ['build', '-t', 'gcr.io/PROJECT_ID/IMAGE_NAME', '.']
    - name: 'gcr.io/cloud-builders/docker'
      args: ['push', 'gcr.io/PROJECT_ID/IMAGE_NAME']
    

    JSON

    {
      "steps": [
       {
          "name": "gcr.io/cloud-builders/docker",
          "args": [
              "build",
              "-t",
              "gcr.io/PROJECT_ID/IMAGE_NAME",
              "."
           ]
       },
       {
           "name": "gcr.io/cloud-builders/docker",
           "args": [
              "push",
              "gcr.io/PROJECT_ID/IMAGE_NAME"
            ]
       }
      ]
    }
    

    其中:

    • PROJECT_ID 是您的 Cloud 项目 ID。
    • IMAGE_NAME 是容器映像的名称。
  3. 使用构建配置文件启动构建:

    gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORY
    

    其中:

    • CONFIG_FILE_PATH 是构建配置文件的路径。
    • SOURCE_DIRECTORY 是源代码的路径或网址。

如需将存储映像作为构建流程的一部分,并在构建结果中显示映像,请执行以下操作

  1. 在应用源代码和 Dockerfile 所在的目录中,创建一个名为 cloudbuild.yamlcloudbuild.json 的文件。
  2. 在构建配置文件中,在用于构建映像的步骤之后,添加一个步骤来调用 Docker push 命令,然后添加 images 字段:

    YAML

    steps:
    - name: 'gcr.io/cloud-builders/docker'
      args: ['build', '-t', 'gcr.io/PROJECT_ID/IMAGE_NAME', '.']
    - name: 'gcr.io/cloud-builders/docker'
      args: ['push', 'gcr.io/PROJECT_ID/IMAGE_NAME']
    images: ['gcr.io/PROJECT_ID/IMAGE_NAME']
    

    JSON

    {
        "steps": [
       {
           "name": "gcr.io/cloud-builders/docker",
           "args": [
               "build",
               "-t",
               "gcr.io/PROJECT_ID/IMAGE_NAME",
               "."
            ]
       },
       {
           "name": "gcr.io/cloud-builders/docker",
           "args": [
               "push",
               "gcr.io/PROJECT_ID/IMAGE_NAME"
            ]
       }
       ],
        "images": [
           "gcr.io/PROJECT_ID/IMAGE_NAME"
        ]
    }
    

    其中:

    • PROJECT_ID 是您的 Cloud 项目 ID。
    • IMAGE_NAME 是容器映像的名称。
  3. 使用构建配置文件启动构建:

    gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORY
    

    其中:

    • CONFIG_FILE_PATH 是构建配置文件的路径。
    • SOURCE_DIRECTORY 是源代码的路径或网址。

运行 Docker 映像

要验证您构建的映像是否按预期正常运行,可使用 Docker 运行该映像。

  1. 将 Docker 配置为与 Container Registry 交互时使用 Container Registry 凭据(您只需执行此操作一次):

    gcloud auth configure-docker
    

    您将看到如下所示的消息:

    The following settings will be added to your Docker config file
    located at [/.docker/config.json]:
    
    {
      "credHelpers": {
        "gcr.io": "gcloud",
        "us.gcr.io": "gcloud",
        "eu.gcr.io": "gcloud",
        "asia.gcr.io": "gcloud",
        "staging-k8s.gcr.io": "gcloud",
        "marketplace.gcr.io": "gcloud"
      }
    }
    
    Do you want to continue (Y/n)?
    
  2. 输入 y,然后按 Enter 键。

  3. 运行您之前构建的 Docker 映像,其中 PROJECT_ID 是您的 Cloud 项目 ID:

    docker run gcr.io/PROJECT_ID/IMAGE_NAME
    

    您将看到如下所示的输出:

    Hello, world! The time is Fri Feb  2 16:09:54 UTC 2018.
    

后续步骤