通过为 Cloud Run 配置自动基础映像更新,使 Google 能够自动为基础映像的操作系统和语言运行时组件进行安全补丁。您无需重新构建或重新部署服务即可更新基础映像。更新基础映像时,系统不会创建新的修订版本。
如需了解如何对使用 gcloud functions
命令或 Cloud Functions v2 API 创建的函数设置安全更新政策,请参阅执行环境安全性。
下图展示了应用代码和依赖项(“应用映像”)如何在语言运行时、操作系统软件包和操作系统(“基础映像”)之上分层。Google 会自动更新基础映像的组件。
安全更新政策
自动更新:运行时环境的更新和安全补丁会在新版本的运行时映像中发布。在经过一段时间的稳定性和可靠性测试后,更新后的运行时会发布到所有服务,从而使更新停机时间为零。如需进行语言级安全修复,您可能需要重新构建使用编译语言(如 Go 或 Java)的函数或服务。
在部署更新时:除非另有说明,否则更新或安全补丁仅在部署或重新部署服务时应用于运行时。部署时更新同时适用于 Cloud Run functions(第 1 代)和 Cloud Run functions。
默认情况下,对于使用以下方式部署的函数,自动安全更新处于启用状态:
gcloud functions
- Cloud Functions v2 API
- 带有
--functions
标志和--base-image
标志的gcloud run
配置自动基础映像更新
如需配置基础映像自动更新,请执行以下操作:
选择基础映像
基础映像是大多数基于容器的开发工作流的起点。开发者从基础映像开始,在其上叠加运行应用所需的库、二进制文件和配置文件。
Google Cloud 的 Buildpack 发布和维护用于构建无服务器应用的基础映像。这些基础映像基于 Ubuntu Linux 发行版构建。
Cloud Run 仅支持使用 Google Cloud 的 Buildpack 基础映像的自动基础映像。
选择 Buildpack 基础映像时,您必须考虑以下事项:
- 栈:栈由 Linux 发行版版本和系统软件包(例如 OpenSSL 和 curl)组成。
- 语言:应用使用的编程语言的特定版本。
如需详细了解基础映像变体,请参阅运行时基础映像。
构建应用映像
启用了自动更新的服务需要提供省略了基础操作系统层的应用映像。有两种方法可以做到这一点:
- 使用 Cloud Run 从源代码部署(推荐)
- 使用构建系统,将您的应用复制到
scratch
映像
从源代码部署
您可以使用 Cloud Run 源代码部署选项来构建和部署代码,以便您的服务与接收自动更新兼容。为此,您必须在创建应用时提供 --base-image
标志。
例如,如需部署启用了自动基础映像更新的 Node.js 服务,您可以使用以下命令:
gcloud run deploy \
--source . \
--base-image nodejs22 \
--automatic-updates
如需部署函数,您必须将 --function
标志与源代码中的函数入口点一起指定。
基于 scratch
构建
您还可以使用构建工具链来创建与自动基础映像更新兼容的应用容器映像。
当您部署具有自动基础映像更新的 Cloud Run 服务时,应用容器映像会在基础容器映像上分层。应用容器映像应仅包含应用,而非基础容器映像中提供的操作系统或运行时。
如需创建应用容器映像,请执行以下操作:
- 创建一个多阶段 Dockerfile,用于:
- 使用包含所需依赖项的适当基础映像构建应用。
- 将构建的组件复制到暂存映像上。
- 构建应用容器映像并将其推送到 Artifact Registry。
- 将应用容器映像部署到 Cloud Run,并指定基础映像。
创建多阶段 Dockerfile
在本指南中,我们将使用 Node.js 应用。本指南不局限于特定语言,可根据您的应用和语言进行自定义。
在项目的根目录中创建一个
Dockerfile
,其中包含以下内容:# This Dockerfile will produce an image that only includes the Node.js app and *not* the Node.js runtime. # The resulting image will not run locally. It is intended at being layered on top of a Node.js base image. FROM node:22-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 WORKDIR /workspace 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,请参阅构建容器。
部署应用映像
现在,您可以使用与应用最兼容的基础映像,部署已启用自动更新的应用映像了。以下示例使用 nodejs22
运行时和 europe-west1
区域。如需详细了解基础映像变体,请参阅运行时基础映像。
如需详细了解所需的角色和权限,请参阅从源代码部署。
gcloud
-
In the Google Cloud console, 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.
如需在部署应用映像时为
nodejs22
运行时启用自动更新,请运行以下命令:gcloud run deploy SERVICE \ --image APP_IMAGE \ --base-image BASE_IMAGE
您需要进行如下替换:
- 将 SERVICE 替换为您要部署到的服务的名称。
- 将 APP_IMAGE 替换为应用容器映像的网址。
- 将 BASE_IMAGE 替换为基础映像的网址,例如
nodejs22
或europe-west1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs22
;如需详细了解基础映像变体,请参阅运行时基础映像。
YAML
如果您要创建新的服务,请跳过此步骤。如果您要更新现有服务,请下载其 YAML 配置:
gcloud run services describe SERVICE --format export > service.yaml
更新
runtimeClassName
和run.googleapis.com/base-images
注解:apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE spec: template: metadata: annotations: run.googleapis.com/base-images: '{"NAME":"BASE_IMAGE"}' spec: containers: - name: NAME image: APP_IMAGE runtimeClassName: run.googleapis.com/linux-base-image-update
您需要进行如下替换:
- 将 SERVICE 替换为您要部署到的服务的名称。
- 将 APP_IMAGE 替换为应用容器映像的网址。
- 将 BASE_IMAGE 替换为基础映像的网址,例如
europe-west1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs22
。如需详细了解基础映像变体,请参阅运行时基础映像。
Terraform
如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令。
将以下内容添加到 Terraform 配置中的google_cloud_run_v2_service
资源:resource "google_cloud_run_v2_service" "default" {
provider = google-beta
name = "SERVICE"
location = "REGION"
template {
containers {
image = "IMAGE_URL"
base_image_uri = "BASE_IMAGE"
}
}
}
您需要进行如下替换:
- 将 SERVICE 替换为您要部署到的服务的名称。
- 将 REGION 替换为 Google Cloud 区域。
- 将 IMAGE_URL 替换为对容器映像的引用,例如
us-docker.pkg.dev/cloudrun/container/hello:latest
。 如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址格式为LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
- 将 BASE_IMAGE 替换为基础映像的网址,例如
us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs22
。如需详细了解基础映像变体,请参阅运行时基础映像。
重组容器映像以在本地运行
在与自动基础映像更新结合使用的自动容器映像基于 scratch
构建,无法在启用了基础映像更新的 Cloud Run 之外运行。您可以通过在兼容的基础映像上对应用映像变基来使应用映像可运行。
在工作站上安装 Docker 社区版 (CE)。
下载应用映像:
docker pull APP_IMAGE
将 APP_IMAGE 替换为容器映像的网址。
下载基础映像:
docker pull BASE_IMAGE
将 BASE_IMAGE 替换为兼容基础映像的完整映像路径。如需查看可用基础映像的列表,请参阅 Google Cloud 的 Buildpack 基础映像。
重组映像:
使用
Dockerfile
将应用映像中的所有文件复制回基础映像:ARG APP_IMAGE ARG NEW_BASE_IMAGE # first copy all files from the app image onto the builder image FROM ${APP_IMAGE} AS app FROM ${NEW_BASE_IMAGE} AS builder COPY --from=app / / # restore the app image config by copying everything from previous step back # back onto the app image FROM ${APP_IMAGE} COPY --from=builder / /
构建映像:
docker build \ -t IMAGE \ --build-arg APP_IMAGE=APP_IMAGE \ --build-arg NEW_BASE_IMAGE=BASE_IMAGE \ .
将 IMAGE 替换为重组后映像的名称。
如果您看到
ARG ${APP_IMAGE}
和ARG ${NEW_BASE_IMAGE}
不是有效基础映像的警告,则可以放心地忽略这些警告并运行映像:docker run -p 8080:8080 IMAGE
停用自动更新
从源代码部署时
从源代码部署时,您可以使用 --no-automatic-updates
标志停用自动基础映像更新。以下示例展示了如何为 Node.js 服务停用自动基础映像更新:
gcloud
gcloud run deploy SERVICE \ --source . \ --base-image nodejs22 \ --no-automatic-updates
部署容器映像时
如需为使用基于暂存映像构建的容器映像的服务停用基础映像更新,您必须部署包含基础映像的新容器映像并移除基础映像:
gcloud
-
In the Google Cloud console, 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.
如需停用自动基础映像更新,请运行以下命令:
gcloud run deploy SERVICE \ --image IMAGE \ --base-image ""
您需要进行如下替换:
- 将 SERVICE 替换为您要部署到的服务的名称。
- 将 IMAGE 替换为包含应用、运行时和操作系统的容器映像的网址。
YAML
如果您要创建新的服务,请跳过此步骤。如果您要更新现有服务,请下载其 YAML 配置:
gcloud run services describe SERVICE --format export > service.yaml
删除
run.googleapis.com/base-images
注解。删除
runtimeClassName
属性。在
image
中,请务必使用包含应用、运行时和操作系统的容器映像。使用以下命令创建或更新服务:
gcloud run services replace service.yaml
查看基础映像版本
如需查看用于提供应用的基础映像版本,请查看 Cloud Run 服务日志中的 LogEntry.labels.run.googleapis.com/base_image_versions
资源。
已知限制
自动基础映像更新仅支持 Google Cloud 的 Buildpack 基础映像。您无法使用自己的基础映像。
自动更新基础映像后,使用编译语言的应用不会重新编译。
应用映像的安全扫描可能不完整。由于应用映像现在基于
scratch
构建,因此安全扫描工具只会扫描映像的应用部分。如需获取更完整的容器安全映像,您还必须针对 Google 提供的相应基础映像运行扫描。您可以下载基础映像,并使用开源工具运行扫描。