對 Cloud Run 進行疑難排解

此頁面提供一些常見問題的疑難排解策略以及解決方案。

如果您在部署新的修訂版本時看到下列錯誤訊息:「Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable.」(容器無法啟動。無法啟動然後監聽 PORT 環境變數定義的通訊埠。),請使用下列步驟針對問題進行疑難排解。

您的容器是否在本機執行?

對 Cloud Run 問題進行疑難排解時,第一個步驟永遠都是確認您可以在本機執行您的容器映像檔。如果您的容器映像檔未在本機執行,則問題的根本原因不在 Cloud Run。您必須先在本機診斷並修正問題。

您的容器是否在預期的通訊埠上監聽要求?

常見的問題是容器忘記監聽傳入要求,或是在錯誤的通訊埠上監聽傳入要求。

容器執行階段合約所述,您的容器必須在由 Cloud Run 定義,並於 PORT 環境變數中提供的通訊埠上監聽傳入要求。

如果您的容器無法在預期的通訊埠上進行監聽,修訂版本健康狀態檢查將會失敗,使得修訂版本處於錯誤狀態,流量不會轉送到這個修訂版本。

您的容器是否監聽了所有的網路介面?

Cloud Run 服務無法啟動的一個常見原因,是容器中的伺服器處理程序設為監聽 localhost (127.0.0.1) 位址。這個位址參照到回送 (loopback) 網路介面,由於這個介面無法從容器外存取,因此無法執行 Cloud Run 健康狀態檢查,造成服務部署失敗。

如要解決這個問題,請將您的應用程式設定為啟動 HTTP 伺服器以監聽所有網路介面,通常以 0.0.0.0 表示。

您在記錄中有看到錯誤嗎?

您應使用 Stackdriver Logging,在 stdoutstderr 記錄檔中尋找應用程式錯誤。您也可以從 Stackdriver Error Reporting 所擷取的當機事件進行瞭解。為修正這些錯誤或當機事件,您可能需要更新您的程式碼或修訂版本設定。

您的容器執行個體是否超過記憶體限制?

您的容器執行個體可能超過可用的記憶體。要判斷是否如此,請在 varlog/system 記錄檔中尋找這類錯誤。如果執行個體超過可用的記憶體,請考慮提高記憶體限制

請注意,在執行 Cloud Run 容器執行個體的環境中,檔案寫入本機檔案系統將計入可用記憶體中。這也包含所有「未」寫入 /var/log/*/dev/log 的記錄檔案。

開啟或呼叫服務網址時出現 403「Error: Forbidden」(錯誤:已禁止)?

如果您在存取 Cloud Run 服務時收到 403「Error: Forbidden」(錯誤:已禁止) 錯誤訊息,代表您的客戶未獲授權叫用這項服務。您可以採取下列其中一個行動來解決這個問題:

您是否在出現長時間執行的要求時,看到錯誤代碼 203?

如果您的服務正在處理要求而耗用時間過長,此時您增加了要求的逾時時間,您可能會看到要求提前終止,且出現錯誤代碼 203。這可能是因為您也需要更新程式語言架構的要求逾時設定。例如,Node.js 開發人員需要更新 server.timeout 屬性

您是否在高載入發生時,看到 503 錯誤?

Cloud Run 負載平衡器會努力將傳入要求分散到必要的容器執行個體數量。但是,如果您的容器執行個體使用大量的 CPU 來處理要求,容器執行個體就無法處理所有要求,使得某些要求傳回 503 錯誤代碼。

如要解決這項問題,請試著降低並行。請從 concurrency = 1 開始,然後慢慢往上增加,直到您找到可接受的值為止。詳情請參閱設定並行一文。

您的問題起因於容器沙箱的限制嗎?

如果您的容器能夠在本機上執行,卻無法在 Cloud Run 中執行,那麼 Cloud Run 容器沙箱可能是容器失敗的原因。

您可以在 GCP 主控台的 Stackdriver Logging 區段 (而非 Cloud Run 區段的「Logs」(記錄) 分頁標籤) 中,於 varlog/system 記錄檔裡尋找「Container Sandbox Limitations」(容器沙箱限制) 嚴重性為「DEBUG」(偵測) 的項目。

varlogs

例如:

Container Sandbox Limitation: Unsupported syscall setsockopt(0x3,0x1,0x6,0xc0000753d0,0x4,0x0)

如果您懷疑以上這些是容器失敗的原因,請與支援小組聯絡,並在支援票證中加入記錄檔訊息。GCP 支援服務可能會要求您追蹤服務發出的系統呼叫,對 Stackdriver 記錄檔中不會顯示的低層級系統呼叫進行診斷。