容器執行階段合約

本頁列出 Cloud Run 容器的重要規定和行為。此外,這個頁面也會在適當位置指出 Cloud Run 服務、Cloud Run 工作和 Cloud Run worker 集區之間的差異。

支援的語言和圖片

只要遵守本頁列出的限制,您的容器映像檔就能執行以自選程式設計語言編寫的程式碼,並使用任何基礎映像檔。

容器映像檔中的可執行檔必須針對 Linux 64 位元編譯。Cloud Run 支援 Linux x86_64 ABI 格式。

Cloud Run 接受 Docker Image Manifest V2、Schema 1Schema 2OCI 映像檔格式的容器映像檔。Cloud Run 也接受 Zstd 壓縮的容器映像檔。

如果部署多架構映像檔資訊清單清單必須包含 linux/amd64

如果是透過 Cloud Run 部署的函式,可以使用 Google Cloud 的建構套件發布的其中一個 Cloud Run 執行階段基礎映像檔,自動接收安全性與維護更新。如要瞭解支援的執行階段,請參閱執行階段支援時程

在正確的通訊埠 (服務) 接聽要求

Cloud Run 服務會啟動 Cloud Run 執行個體,處理傳入的要求。Cloud Run 執行個體一律會有一個監聽要求的單一連入容器,以及一或多個側車容器 (選用)。下列連接埠設定詳細資料僅適用於 Ingress 容器,不適用於 Sidecar。

執行個體內的 Ingress 容器必須在 0.0.0.0 上監聽要求,並使用要求傳送的通訊埠。請注意,連入容器「不應」監聽 127.0.0.1。根據預設,要求會傳送至 8080,但您可以設定 Cloud Run,將要求傳送至您選擇的通訊埠。Cloud Run 會將 PORT 環境變數注入 Ingress 容器。

工作執行期間執行的容器必須在完成後結束

如果是 Cloud Run 工作,容器必須在工作成功完成時以結束代碼 0 結束,並在工作失敗時以非零結束代碼結束。

由於工作不應處理要求,因此容器不應監聽通訊埠或啟動網路伺服器。

傳輸層加密 (TLS)

容器不應直接導入任何傳輸層安全標準。Cloud Run 會終止 HTTPS 和 gRPC 的 TLS,然後將要求以 HTTP/1 或 gRPC 形式代理至容器,不使用 TLS。

如果您設定 Cloud Run 服務使用 HTTP/2 端對端連線,容器必須以 HTTP/2 純文字 (h2c) 格式處理要求,因為 Cloud Run 仍會自動終止 TLS。

回覆 (服務)

如果是 Cloud Run 服務,容器收到要求後,必須在要求逾時設定指定的時間內傳送回應,包括容器啟動時間。否則要求會結束,並傳回 504 錯誤。

回應快取和 Cookie

如果 Cloud Run 服務的回應包含 Set-Cookie 標頭,Cloud Run 會將 Cache-Control 標頭設為 private,確保回應不會遭到快取。這樣可防止其他使用者擷取 Cookie。

環境變數

Cloud Run 服務和工作可使用不同的環境變數集。

服務的環境變數

下列環境變數會自動新增至所有執行中的容器,但 PORT 除外。PORT 變數只會新增至輸入容器:

名稱 說明 範例
PORT HTTP 伺服器應監聽的通訊埠。 8080
K_SERVICE 要執行的 Cloud Run 服務名稱。 hello-world
K_REVISION 正在執行的 Cloud Run 修訂版本名稱。 hello-world.1
K_CONFIGURATION 建立修訂版本的 Cloud Run 設定名稱。 hello-world

工作環境變數

如果是 Cloud Run 作業,系統會設定下列環境變數:

名稱 說明 範例
CLOUD_RUN_JOB 要執行的 Cloud Run 工作名稱。 hello-world
CLOUD_RUN_EXECUTION 正在執行的 Cloud Run 執行作業名稱。 hello-world-abc
CLOUD_RUN_TASK_INDEX 這項工作的索引。第一個工作從 0 開始,後續每個工作都會遞增 1,直到工作數量上限減 1 為止。如果將 --parallelism 設為大於 1,工作可能不會按照索引順序執行。舉例來說,工作 2 可能會在工作 1 之前開始。 0
CLOUD_RUN_TASK_ATTEMPT 這個工作的已重試次數。第一次嘗試時為 0,每次重試都會遞增 1,直到達到重試次數上限為止。 0
CLOUD_RUN_TASK_COUNT --tasks 參數中定義的工作數。 1

工作站集區的環境變數

Cloud Run 會為工作站集區設定下列環境變數:

名稱 說明 範例
CLOUD_RUN_WORKER_POOL 執行中 Cloud Run worker 集區的名稱。 hello-world
CLOUD_RUN_WORKER_POOL_REVISION 正在執行的 Cloud Run 工作站集區修訂版本名稱。 hello-world.1

要求和回應標頭規定 (服務)

對於服務,Cloud Run 會將標頭名稱限制為可列印的非空白 ASCII,且不得包含半形冒號。根據 IETF RFC 7230,Cloud Run 會將標頭值限制為可顯示的 ASCII 字元,外加空格和水平定位字元。

檔案系統存取權

每個容器的檔案系統都可寫入,且須遵守下列行為:

  • 這是記憶體內檔案系統,因此寫入該系統會使用執行個體的記憶體。
  • 執行個體停止時,寫入檔案系統的資料不會保留。

您無法為這個檔案系統指定大小限制,因此寫入記憶體內檔案系統時,可能會用盡分配給執行個體的所有記憶體,導致執行個體當機。如要避免這個問題,請使用設有大小限制的專屬記憶體內磁碟區

執行個體生命週期

Cloud Run 作業和服務的生命週期特徵不同,因此我們會在下列小節中分別說明。

服務

下列特性僅適用於服務。

服務資源調度

根據預設,Cloud Run 服務會自動調整執行個體數量,以處理所有傳入要求、事件或 CPU 使用率。如要進一步控管資源調度行為,可以選擇使用手動調度

每個執行個體都會執行固定數量的容器,包括一個 Ingress 容器,以及選用的一或多個 Sidecar 容器。

如果修訂版本未收到任何流量,系統會將其調度至設定的執行個體數量下限 (預設為零)。

啟動

如果是 Cloud Run 服務,執行個體啟動後必須在 4 分鐘內開始接聽要求,且執行個體內的所有容器都必須正常運作。在這段啟動時間內,系統會為執行個體分配 CPU。您可以啟用啟動時 CPU 效能強化,在執行個體啟動期間暫時增加 CPU 分配量,以縮短啟動延遲時間。

只要輸入容器監聽設定的通訊埠,系統就會將要求傳送至該容器。

等待執行個體的要求會保留在佇列中,如下所示:

要求會暫緩處理,時間最多為這項服務容器執行個體平均啟動時間的 3.5 倍,或 10 秒 (以較長者為準)。

您可以設定啟動探測,判斷容器是否已啟動並準備好處理要求。

如果 Cloud Run 服務是由多個容器執行個體組成,您可以設定容器啟動順序,指定執行個體內容器的啟動順序。

處理要求

如果是 Cloud Run 服務,只要 Cloud Run 修訂版本正在處理至少一項要求,系統就會為執行個體中的所有容器 (包括 Sidecar) 分配 CPU。

閒置

如果是 Cloud Run 服務,閒置執行個體是指未處理任何要求的執行個體。

閒置執行個體中分配給所有容器的 CPU 數量,取決於已設定的帳單設定

除非執行個體必須因執行個體數量下限設定而保持閒置,否則閒置時間不會超過 15 分鐘。

關閉

對於 Cloud Run 服務,閒置執行個體隨時可能關閉,包括因設定執行個體數量下限而保持暖機狀態的執行個體。如果需要關閉正在處理要求的執行個體,系統會給予時間讓執行個體完成處理作業,並將新的要求傳送至其他執行個體。在特殊情況下,Cloud Run 可能會啟動關機程序,並將 SIGTERM 信號傳送至仍在處理要求的容器。

關閉執行個體前,Cloud Run 會向執行個體中的所有容器傳送 SIGTERM 信號,表示實際關閉前有 10 秒的緩衝時間,之後 Cloud Run 會傳送 SIGKILL 信號。在這段期間,系統會為執行個體分配 CPU,並向您收費。如果服務使用第一代執行環境,且執行個體未擷取 SIGTERM 信號,系統會立即關閉執行個體。在採用第二代執行環境的服務中,建議您在容器上安裝 SIGTERM 處理常式,以便在 Cloud Run 即將關閉執行個體時收到警告。

強制終止

如果一或多個 Cloud Run 容器超出容器總記憶體限制,執行個體就會終止。執行個體上仍在處理的所有要求都會以 HTTP 500 錯誤結束。

職缺

如果是 Cloud Run 工作,容器執行個體會持續執行,直到容器執行個體結束、達到工作逾時時間,或容器當機為止。

結束代碼

您可以透過工作結束代碼,瞭解工作是否順利完成,或是否發生任何錯誤。結束代碼是數值,會對應至成功完成或特定類型的錯誤。

下表列出常見的結束代碼及其定義:

結束代碼 信號 說明
0 工作順利完成。
4 SIGILL 工作嘗試存取錯誤地址的記憶體。
7 SIGBUS 工作嘗試存取分配邊界外的記憶體。
9 SIGKILL 工作遭到強制終止,可能是使用者操作或手動介入所致。
11 SIGSEGV 工作嘗試存取未經授權的記憶體。
15 SIGTERM 如果工作超過設定的逾時時間或遭到取消,就會收到 SIGTERM 信號。應用程式伺服器會傳送 SIGTERM 信號,要求容器執行個體關閉。如果執行個體在收到 SIGTERM 後幾秒內未自行關閉,Cloud Run 會傳送 SIGKILL 信號,強制終止執行個體。如果執行個體以 SIGTERM 正確結束,可能會回報不同的錯誤代碼;否則會傳回 SIGTERM

強制終止

如果 Cloud Run 容器執行個體超出允許的記憶體限制,系統會終止該執行個體。容器執行個體上仍在處理的所有要求都會以 HTTP 500 錯誤結束。

如果工作超過工作逾時時間,Cloud Run 會傳送「SIGTERM」信號,表示實際關機前 10 秒開始,此時 Cloud Run 會傳送 SIGKILL 信號,關閉容器例項。

在這段期間,容器執行個體在整個生命週期都會分配到 CPU,且會產生費用。

請參閱SIGTERM 程式碼範例,瞭解如何擷取 SIGTERM 信號。

工作站集區

下列特徵僅適用於工作站集區。

資源調度

工作站集區不會自動調整資源配置。手動調整 Cloud Run 工作站集區處理工作負載所需的執行個體數量。根據預設,Cloud Run 會將執行個體數量設為 1。您可以調高或調低這個數字,也可以將數字設為 0 來停用縮放功能。如要啟動並維持運作,工作負載至少須有一個執行個體。如果您將執行個體下限設為 0,即使部署作業成功,工作站執行個體也不會啟動。

啟動

Cloud Run worker 集區執行個體會啟動容器,並使用您在容器映像檔或 worker 集區設定中指定的進入點。執行個體中的所有容器都必須健康。

根據預設,Cloud Run 容器執行個體會使用一個 CPU。您可以根據需求增加或減少這個值。

您可以設定啟動探測作業,判斷容器是否已啟動。啟動探測作業可讓 Cloud Run 檢查相依容器的健康狀態,確保容器通過檢查後,再啟動下一個容器。如果您未使用健康狀態檢查,即使所依附的容器無法啟動,Cloud Run 仍會依指定順序啟動容器。

資源分配

工作站集區不會閒置。無論狀態為何,Cloud Run 一律會為所有容器分配 CPU,包括工作站集區執行個體中的 Sidecar。只要執行個體正在執行,就會視為有效,並據此計費。

關閉

Cloud Run 不會根據閒置執行個體縮減 worker 集區執行個體。如果必須關閉工作負載處理執行個體,Cloud Run 會給予處理中的工作足夠時間完成,並將新的工作負載轉送至其他執行個體。Cloud Run 也可能會啟動關機程序,並將 SIGTERM 信號傳送至仍在處理工作負載的容器。

關閉執行個體前,Cloud Run 會將 SIGTERM 信號傳送至執行個體中的所有容器。這項信號表示實際關機前 10 秒的期間開始,此時 Cloud Run 會傳送 SIGKILL 信號。在關機期間,系統會為執行個體分配 CPU,並收取相關費用。 建議您在容器上安裝 SIGTERM 處理常式,以便在 Cloud Run 即將關閉執行個體時收到警告。

強制終止

如果一或多個 Cloud Run 容器超出容器總記憶體限制,Cloud Run 就會終止執行個體。執行個體上仍在處理的所有要求都會以 HTTP 500 錯誤結束。

容器執行個體資源

以下各節說明容器執行個體的資源:

CPU

根據預設,執行個體中的每個 Cloud Run 容器都會分配到已設定vCPU (預設為 1 個)。您可以分別設定每個容器的 CPU 限制。

vCPU 是基礎硬體的抽象化實作,可在不同 CPU 平台上提供單一硬體超執行緒的約略 CPU 時間。Cloud Run 使用的所有 CPU 平台都支援 AVX2 指令集。請注意,容器合約不包含任何額外的 CPU 平台詳細資料。

容器可能會同時在多個核心上執行。

如果是 Cloud Run 服務,CPU 分配量取決於所選的計費方案。

如果選取以執行個體為依據的計費模式,系統會在執行個體生命週期內分配 CPU。如果選取以要求為依據的計費模式 (預設),系統會在執行個體處理要求時分配 CPU。詳情請參閱帳單設定

如果您已設定執行個體數量下限,就必須採用以執行個體為依據的計費方式,才能在要求以外分配 CPU。

您可以啟用啟動時 CPU 效能強化,在執行個體啟動期間暫時增加 CPU 分配量,以縮短啟動延遲時間。

記憶體

根據預設,每個 Cloud Run 容器都會分配到設定的記憶體 (預設為 512 MiB)。您可以分別設定每個容器的記憶體限制。

記憶體的常見用途包括:

  • 載入記憶體以執行服務的程式碼
  • 寫入檔案系統
  • 在容器中執行的額外程序,例如 nginx 伺服器
  • 記憶體內快取系統,例如 PHP OpCache
  • 每個要求的記憶體用量
  • 共用記憶體內磁碟區

GPU

您可以在 Cloud Run 執行個體中設定容器,以便存取 GPU。 如果 Cloud Run 服務是透過 Sidecar 容器部署,只有部署中的一個容器可以存取 GPU。如需相關規定和詳細資料,請參閱「設定 GPU」。

NVIDIA 程式庫

根據預設,所有 NVIDIA L4 驅動程式庫都會掛接在 /usr/local/nvidia/lib64 下方。Cloud Run 會自動將這個路徑附加至含 GPU 容器的 LD_LIBRARY_PATH 環境變數 (即 ${LD_LIBRARY_PATH}:/usr/local/nvidia/lib64)。動態連結器就能找到 NVIDIA 驅動程式庫。連結器會依您在 LD_LIBRARY_PATH 環境變數中列出的順序,搜尋並解析路徑。您在這個變數中指定的任何值,都會優先於預設的 Cloud Run 驅動程式程式庫路徑 /usr/local/nvidia/lib64

如要使用高於 12.2 的 CUDA 版本,最簡單的方法是依附於較新的 NVIDIA 基本映像檔,其中已安裝向前相容套件。你也可以手動安裝 NVIDIA 前向相容性套件,並將這些套件新增至 LD_LIBRARY_PATH。請參閱 NVIDIA 的相容性矩陣,判斷哪些 CUDA 版本與提供的 NVIDIA 驅動程式版本 (535.216.03) 向前相容。

並行 (服務)

對於 Cloud Run 服務,根據預設,每個 Cloud Run 執行個體都會設為多個「並行」,也就是輸入容器可以同時接收多個要求。如要變更這項設定,請設定並行

容器沙箱

如果您使用第一代執行環境,Cloud Run 容器會透過 gVisor 容器執行階段沙箱機制進行沙箱化。如 gVisor 系統呼叫相容性參考資料所述,這個容器沙箱可能不支援部分系統呼叫。

如果您使用第二代執行環境,則可享有完整的 Linux 相容性。Cloud Run 作業一律使用第二代執行環境。 在第二代執行環境中,/sys/class/dmi/id/product_name 會設為 Google Compute Engine

第二代執行環境會在獨立的程序命名空間中執行服務程式碼,因此會以容器初始化程序啟動,具有特殊的程序語意。在第一代執行環境中,服務程式碼不會以容器初始化程序的形式執行。

檔案描述元限制

Cloud Run 第一代和第二代環境會限制程序可開啟的檔案描述元數量,上限為 25000 個。這適用於容器和建立的任何子程序 (分叉)。這是硬性限制。如果超過上限,執行個體可能會耗盡檔案描述元/插座。

第二代環境的限制

除了先前所述的檔案描述元限制外,第二代環境的限制都是標準 Linux 限制。

舉例來說,可開啟的檔案描述元數量上限 (如 /proc/sys/fs/file-max 中所擷取) 會使用約 10% 記憶體的預設值。詳情請參閱核心說明文件中的 file-maxfile-nr

同樣地,max_map_count (如 /proc/sys/vm/max_map_count 中所擷取) 會設定程序可擁有的記憶體區域數量,目前使用預設值 65535。詳情請參閱核心說明文件中的 max-map-count

特殊權限容器和 setuid 二進位檔

Cloud Run 不支援具備特殊權限的容器。因此,Cloud Run 不支援對非根使用者使用 setuid 標記的二進位檔 (例如 gcsfusesudo),且可能因權限不足而失敗。

其中一個替代方案是以超級使用者身分執行這些二進位檔,然後在執行階段使用 su 指令切換到其他使用者。

舉例來說,在 Dockerfile 中移除 USER 指令,並在進入點指令碼中使用下列序列:

gcsfuse ...                 # Run gcsfuse as root
su myuser -c "/yourapp.sh"  # Switch to 'myuser' and run 'yourapp.sh'

執行使用者

如果使用者名稱不存在,Cloud Run 會以根使用者 (uid=0) 身分執行容器。

執行個體中繼資料伺服器

Cloud Run 執行個體會公開中繼資料伺服器,您可使用該伺服器擷取容器的詳細資料,例如專案 ID、區域、執行個體 ID 或服務帳戶。您也可以使用中繼資料伺服器為服務身分產生權杖

如要存取中繼資料伺服器資料,請使用 HTTP 要求搭配 Metadata-Flavor: Google 標頭,傳送至 http://metadata.google.internal/ 端點,不需要用戶端程式庫。詳情請參閱「取得中繼資料」。

下表列出部分可用的中繼資料伺服器資訊:

路徑 說明
/computeMetadata/v1/project/project-id Cloud Run 服務或作業所屬專案的專案 ID
/computeMetadata/v1/project/numeric-project-id Cloud Run 服務或作業所屬專案的專案編號
/computeMetadata/v1/instance/region 這個 Cloud Run 服務或工作的區域,會傳回 projects/PROJECT-NUMBER/regions/REGION
/computeMetadata/v1/instance/id 執行個體的專屬 ID (也顯示在記錄中)。
/computeMetadata/v1/instance/service-accounts/default/email 這個 Cloud Run 服務或作業的服務身分電子郵件地址。
/computeMetadata/v1/instance/service-accounts/default/token 這個 Cloud Run 服務或作業的服務帳戶產生 OAuth2 存取權杖。Cloud Run 服務代理人會用於擷取權杖。這個端點會傳回含有 access_token 屬性的 JSON 回應。進一步瞭解如何擷取及使用這個存取權杖。

請注意,Cloud Run 不會提供執行執行個體的Google Cloud 區域詳細資料。因此,中繼資料屬性 /computeMetadata/v1/instance/zone 一律會傳回 projects/PROJECT-NUMBER/zones/REGION-1

檔案名稱

容器中使用的檔案名稱必須與 UTF-8 相容,也就是 UTF-8 或可安全自動轉換為 UTF-8 的格式。如果檔案名稱使用不同的編碼,請在檔案名稱與 UTF-8 相容的電腦上執行 Docker 建構,並避免將檔案複製到含有不相容 UTF-8 名稱的容器。

如果檔案名稱不相容於 UTF-8,容器部署作業就會失敗。請注意,檔案中使用的字元編碼沒有限制。

傳出要求逾時

如果是 Cloud Run 服務和工作,容器向 VPC 發出的要求閒置 10 分鐘後,就會逾時。如果容器向網際網路發出要求,閒置 20 分鐘後就會逾時。

傳出連線重設

容器與 VPC 和網際網路之間的連線串流,可能會在基礎架構重新啟動或更新時終止並取代。如果應用程式會重複使用長期連線,建議您將應用程式設為重新建立連線,避免重複使用已失效的連線。