配置自动基础映像更新

通过为 Cloud Run 配置自动基础映像更新,使 Google 能够自动为应用映像的操作系统和运行时组件打安全补丁。您无需重新构建或重新部署服务。

如需配置基础映像自动更新,请执行以下操作:

  • 选择兼容的 Cloud Run 基础映像。
  • 构建和部署应用映像的方式应能保留安全地重新设置正在运行的服务的能力。

选择基础映像

基础映像是大多数基于容器的开发工作流的起点。开发者从基础映像开始,在其上叠加用于运行应用的必要库、二进制文件和配置文件。

Google Cloud 的 Buildpack 发布和维护用于构建无服务器应用的基础映像。这些基础映像基于 Ubuntu Linux 发行版构建。

Cloud Run 仅支持使用 Google Cloud 的 Buildpack 基础映像的自动基础映像。

选择 Google Cloud 的 Buildpack 时,您必须考虑以下事项:

  • 堆栈堆栈由 Linux 发行版版本和系统软件包(例如 OpenSSL 和 curl)组成。
  • 语言:应用使用的编程语言的具体版本

如需详细了解基础映像变体,请参阅运行时基础映像

构建应用映像

启用了自动更新的服务将需要提供省略基本操作系统层的应用映像。有两种方法可以做到这一点:

从源代码部署

您可以使用 Cloud Run 从源代码部署功能构建应用,使其与自动更新兼容。为此,您必须在创建应用时提供 --base-image 标志。

例如,如需部署启用了自动基础映像更新的 Python 服务或函数,可以使用以下命令:

gcloud beta run deploy python-application \
  --source . \
  --base-image=python312

基于 scratch 构建

您还可以使用构建工具链创建与自动基础映像更新兼容的应用映像。为了实现此目的,您需要:

  1. 创建多阶段 Dockerfile。
    1. 使用具有所需依赖项的相应基础映像构建应用。
    2. 将构建的组件复制到暂存映像。
  2. 构建应用映像并发布到 Artifact Registry。
  3. 使用 Cloud Run 部署应用。

创建多阶段 Dockerfile

在本指南中,我们将使用 Node.js 应用。本指南不局限于特定语言,可根据您的应用和语言进行自定义。

  • 在项目的根目录中创建一个 Dockerfile,其中包含以下内容:

    FROM node:18-slim as builder
    
    # Create and change to the app directory.
    WORKDIR /usr/src/app
    
    # Copy application dependency manifests to the container image and install
    # production dependencies.
    COPY package*.json ./
    RUN npm install --only=production
    
    # Copy local code to the container image.
    COPY . ./
    
    # Copy the application source code and depenencies onto a scratch image.
    FROM scratch
    COPY --from=builder --chown=33:33 /usr/src/app/ ./
    
    # Run the web service on container startup.
    CMD [ "node", "index.js" ]
    

此 Dockerfile 使用多阶段构建将应用源代码和依赖项复制到 scratch 映像,该映像会省略 Cloud Run 托管式基础映像在运行时提供的操作系统、软件包和运行时组件。

构建应用映像

构建应用映像并将其上传到 Artifact Registry。如需详细了解如何使用 Cloud Build 构建 Dockerfile 并将其上传到 Artifact Registry,请参阅构建容器

部署应用映像

现在,您可以使用与应用最兼容的基础映像,部署已启用自动更新的应用映像了。在此示例中,我们将使用 us-central1 中的 Node.js 18 运行时。如需详细了解基础映像变体,请参阅运行时基础映像

如需详细了解所需的角色和权限,请参阅将容器映像部署到 Cloud Run

gcloud beta run deploy SERVICE \
  --image=IMAGE \
  --base-image=us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs18

您需要将其中的:

  • SERVICE 替换为您要部署到的服务的名称。服务名称不得超过 49 个字符,并且在每个区域和项目中必须是唯一的。 如果服务尚不存在,则此命令会在部署期间创建服务。您可以完全省略此参数,但如果省略它,系统将提示您输入服务名称。
  • IMAGE 替换为容器映像的网址。

服务字段和注解

启用自动安全更新后,将使用以下数据来丰富您的服务配置。

YAML

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: SERVICE
annotations:
    ...
    run.googleapis.com/build-base-image: BASE_IMAGE_URL
    run.googleapis.com/launch-stage: BETA
    ...
spec:
...
runtimeClassName: run.googleapis.com/linux-base-image-update

您需要将其中的:

  • SERVICE 替换为您要部署到的服务的名称。服务名称不得超过 49 个字符,并且在每个区域和项目中必须是唯一的。如果服务尚不存在,则此命令会在部署期间创建服务。您可以完全省略此参数,但如果省略它,系统将提示您输入服务名称。
  • BASE_IMAGE_URL,这是在下一次部署中使用的基础映像。BASE_IMAGE_URL 将用于下一个来源函数部署。如需详细了解基础映像变体,请参阅运行时基础映像

停用自动更新

您可以通过更新服务定义来停用自动安全更新。

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. 如需停用 Node.js 18 运行时的自动更新,请运行以下命令:

gcloud beta run deploy SERVICE \
    --image=IMAGE \
    --base-image=nodejs18 \
    --no-automatic-updates

您需要将其中的:

  • SERVICE 替换为您要部署到的服务的名称。服务名称不得超过 49 个字符,并且在每个区域和项目中必须是唯一的。如果服务尚不存在,则此命令会在部署期间创建服务。您可以完全省略此参数,但如果省略它,系统将提示您输入服务名称。
  • IMAGE 替换为容器映像的网址。

YAML

  1. 如果您要创建新的服务,请跳过此步骤。如果您要更新现有服务,请下载其 YAML 配置

    gcloud run services describe SERVICE --format export > service.yaml
  2. 删除 run.googleapis.com/build-base-image: BASE_IMAGE_URL 行。移除 runtimeClassName 行是可选操作。

  3. 使用以下命令将服务替换为其新配置:

    gcloud run services replace service.yaml

已知限制

  • Cloud Run 仅支持 Google Cloud 的 Buildpack 基础映像

  • 自动更新基础映像后,使用编译后语言的应用不会重新编译。

  • 应用映像的安全扫描可能不完整。由于您的应用映像现在基于 scratch 构建,因此安全扫描器只会扫描映像的应用部分。如需获取更完整的容器安全映像,您还必须针对 Google 提供的相应基础映像运行扫描。您可以下载基础映像并使用开源工具运行扫描。