通过为 Cloud Run 配置自动基础映像更新,使 Google 能够自动为应用映像的操作系统和运行时组件打安全补丁。您无需重新构建或重新部署服务。
如需配置基础映像自动更新,请执行以下操作:
选择基础映像
基础映像是大多数基于容器的开发工作流的起点。开发者从基础映像开始,在其上叠加用于运行应用的必要库、二进制文件和配置文件。
Google Cloud 的 Buildpack 发布和维护用于构建无服务器应用的基础映像。这些基础映像基于 Ubuntu Linux 发行版构建。
Cloud Run 仅支持使用 Google Cloud 的 Buildpack 基础映像的自动基础映像。
选择 Google Cloud 的 Buildpack 时,您必须考虑以下事项:
- 堆栈:堆栈由 Linux 发行版版本和系统软件包(例如 OpenSSL 和 curl)组成。
- 语言:应用使用的编程语言的具体版本
如需详细了解基础映像变体,请参阅运行时基础映像。
构建应用映像
启用了自动更新的服务将需要提供省略基本操作系统层的应用映像。有两种方法可以做到这一点:
- 使用 Cloud Run 从源代码部署(推荐)
- 使用构建系统,将您的应用复制到
scratch
映像
从源代码部署
您可以使用 Cloud Run 从源代码部署功能构建应用,使其与自动更新兼容。为此,您必须在创建应用时提供 --base-image
标志。
例如,如需部署启用了自动基础映像更新的 Python 服务或函数,可以使用以下命令:
gcloud beta run deploy python-application \
--source . \
--base-image=python312
基于 scratch
构建
您还可以使用构建工具链创建与自动基础映像更新兼容的应用映像。为了实现此目的,您需要:
- 创建多阶段 Dockerfile。
- 使用具有所需依赖项的相应基础映像构建应用。
- 将构建的组件复制到暂存映像。
- 构建应用映像并发布到 Artifact Registry。
- 使用 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
您需要将其中的:
停用自动更新
您可以通过更新服务定义来停用自动安全更新。
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.
如需停用 Node.js 18 运行时的自动更新,请运行以下命令:
gcloud beta run deploy SERVICE \ --image=IMAGE \ --base-image=nodejs18 \ --no-automatic-updates
您需要将其中的:
- 将 SERVICE 替换为您要部署到的服务的名称。服务名称不得超过 49 个字符,并且在每个区域和项目中必须是唯一的。如果服务尚不存在,则此命令会在部署期间创建服务。您可以完全省略此参数,但如果省略它,系统将提示您输入服务名称。
- 将 IMAGE 替换为容器映像的网址。
YAML
如果您要创建新的服务,请跳过此步骤。如果您要更新现有服务,请下载其 YAML 配置:
gcloud run services describe SERVICE --format export > service.yaml
删除
run.googleapis.com/build-base-image: BASE_IMAGE_URL
行。移除runtimeClassName
行是可选操作。使用以下命令将服务替换为其新配置:
gcloud run services replace service.yaml
已知限制
Cloud Run 仅支持 Google Cloud 的 Buildpack 基础映像。
自动更新基础映像后,使用编译后语言的应用不会重新编译。
应用映像的安全扫描可能不完整。由于您的应用映像现在基于
scratch
构建,因此安全扫描器只会扫描映像的应用部分。如需获取更完整的容器安全映像,您还必须针对 Google 提供的相应基础映像运行扫描。您可以下载基础映像并使用开源工具运行扫描。