設定自動更新基本映像檔

為 Cloud Run 設定自動基本映像檔更新功能,Google 就能自動為基本映像檔的作業系統和語言執行階段元件提供安全性修補程式。您不必重新建構或重新部署服務,即可更新基礎映像檔。更新基礎映像檔時,系統不會建立新的修訂版本。

如要瞭解如何針對使用 gcloud functions 指令或 Cloud Functions v2 API 建立的函式設定安全性更新政策,請參閱「執行環境安全性」。

下圖顯示應用程式程式碼和依附元件 (「應用程式映像檔」) 如何在語言執行階段、OS 套件和作業系統 (「基礎映像檔」) 之上層疊。Google 會自動更新基本映像檔的元件。

Cloud Run 基礎映像檔圖表

安全性更新政策

  • 自動更新:執行階段環境的更新和安全性修補程式會在新版的執行階段映像檔中發布。經過一段時間的穩定性和可靠性測試後,更新的執行階段會推送至所有服務,進而實現零停機時間更新。如要採用語言層級安全性修正,您可能需要重建使用編譯語言 (例如 Go 或 Java) 的函式或服務。

  • 關於部署更新:除非另有說明,否則只有在部署或重新部署服務時,才會將更新和安全性修補程式套用至執行階段。您可以在 Cloud Run 函式 (第 1 代) 和 Cloud Run 函式中查看部署作業更新。

根據預設,系統會為使用以下方式部署的函式啟用自動安全性更新功能:

設定自動更新基本映像檔

如要設定自動更新基本映像檔,請按照下列步驟操作:

  • 選取相容的 Cloud Run 基本映像檔。
  • 建構及部署應用程式映像檔,以便安全地重新設定執行中的服務。

選取基礎圖片

基礎映像檔是大多數以容器為基礎的開發工作流程的起點。開發人員會從基本映像檔開始,並在其上層疊上用於執行應用程式的必要程式庫、二進位檔和設定檔。

Google Cloud 的 Buildpack 會發布及維護用於建構無伺服器應用程式的基本映像檔。這些基本映像檔是建構在 Ubuntu Linux 發行版本之上。

Cloud Run 僅支援使用 Google Cloud 的 Buildpacks 基本映像檔的自動基本映像檔。

選擇 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 服務時,應用程式容器映像檔會疊加在基本容器映像檔上。應用程式容器映像檔應只包含應用程式,而非基本容器映像檔提供的作業系統或執行階段。

如要建立應用程式容器映像檔,請按照下列步驟操作:

  1. 建立多階段 Dockerfile,以便:
    1. 使用含有必要依附元件的適當基本映像檔建構應用程式。
    2. 將已建構的元件複製到暫存映像檔
  2. 建構應用程式容器映像檔,並推送至 Artifact Registry。
  3. 將應用程式容器映像檔部署至 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:nodejs22-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,請參閱「建構容器」一文。

部署應用程式映像檔

您現在可以部署應用程式映像檔,並啟用自動更新功能,使用最相容的應用程式基本映像檔。在這個範例中,我們會使用 us-central1 中的 nodejs22 執行階段。請參閱執行階段基本映像檔,進一步瞭解基本映像檔變化。以下範例使用 nodejs22 執行階段和 us-central1 區域。如要進一步瞭解基礎映像檔變化版本,請參閱執行階段基礎映像檔

如要進一步瞭解所需角色和權限,請參閱「從原始碼部署」一文。

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. 如要在部署應用程式映像檔時啟用 nodejs22 執行階段的自動更新功能,請執行下列指令:

    gcloud run deploy SERVICE \
        --image APP_IMAGE \
        --base-image BASE_IMAGE

    取代:

    • SERVICE 替換成您要部署的服務名稱。
    • APP_IMAGE 與應用程式容器映像檔的網址。
    • BASE_IMAGE 與基本映像檔的網址,例如 nodejs22us-central1-docker.pkg.dev/serverless-runtimes/google-22/runtimes/nodejs22。請參閱「執行階段基本映像檔」,進一步瞭解基本映像檔變化版本。

YAML

  1. 如果您要建立新服務,請略過這個步驟。如果您要更新現有服務,請下載其 YAML 設定

    gcloud run services describe SERVICE --format export > service.yaml
  2. 更新 runtimeClassNamerun.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 與基準圖片的網址,例如 us-central1-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 外執行。您可以將應用程式映像檔重設為相容的基礎映像檔,讓應用程式映像檔可執行。

  1. 在工作站上安裝 Docker Community Edition (CE)

  2. 下載應用程式映像檔:

    docker pull APP_IMAGE
    

    APP_IMAGE 替換為容器映像檔的網址。

  3. 下載基本映像檔:

    docker pull BASE_IMAGE
    

    BASE_IMAGE 替換為相容的基礎圖片的完整圖片路徑。如要查看可用的映像檔清單,請參閱 Google Cloud 的 Buildpacks 基本映像檔

  4. 重新組合圖片:

    使用 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

  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. 如要停用自動更新基本映像檔功能,請執行下列指令:

    gcloud run deploy SERVICE \
        --image IMAGE \
        --base-image ""

    取代:

    • SERVICE 替換成您要部署的服務名稱。
    • IMAGE 與包含應用程式、執行階段和作業系統的容器映像檔網址。

YAML

  1. 如果您要建立新服務,請略過這個步驟。如果您要更新現有服務,請下載其 YAML 設定

    gcloud run services describe SERVICE --format export > service.yaml
  2. 刪除 run.googleapis.com/base-images 註解。

  3. 刪除 runtimeClassName 屬性。

  4. image 中,請務必使用包含應用程式、執行階段和作業系統的容器映像檔。

  5. 使用下列指令建立或更新服務:

    gcloud run services replace service.yaml

查看基礎映像檔版本

如要查看用於提供應用程式的基礎映像檔版本,請在 Cloud Run 服務記錄中查看 LogEntry.labels.run.googleapis.com/base_image_versions 資源

已知限制

  • 自動更新基本映像檔僅支援 Google Cloud 的 Buildpacks 基本映像檔。您無法使用自己的基本映像檔。

  • 自動更新基本映像檔時,使用編譯語言的應用程式不會重新編譯。

  • 應用程式映像檔的安全性掃描作業可能不完整。由於應用程式映像檔現在是建構在 scratch 上,安全性掃描器只會掃描映像檔的應用程式部分。如要取得更完整的容器安全性圖像,您必須在對應的 Google 提供的基礎映像檔上執行掃描作業。您可以下載基礎映像檔,並使用開放原始碼工具執行掃描作業。