如何解決無法從 Amazon ECR 提取映像檔的 Amazon ECS 任務?

2 分的閱讀內容
0

我無法在 Amazon Elastic Container Service (Amazon ECS) 任務中從 Amazon Elastic Container Registry (Amazon ECR) 提取映像檔。或者,我收到「CannotPullContainerError: API 錯誤」訊息。

簡短說明

由於下列原因,您可能會收到 CannotPullContainerError

  • 您使用沒有網際網路的私人子網路,因此您的啟動類型無法存取 Amazon ECR 端點。
  • 您的 Amazon ECR 儲存庫政策限制存取儲存庫映像檔。
  • 您的 Amazon ECS 任務執行或執行個體角色沒有提取映像檔的正確權限。
  • 請求的映像檔 URI 不存在。
  • 磁碟上沒有足夠的空間來儲存該映像檔。
  • 您超過了提取率配額。
  • 您的任務與 Amazon ECR 端點之間缺少網路路徑。
  • 您的 Docker 憑證已過期。

解決方法

確定問題的原因

使用 AWSSupport-TroubleshootECSTaskFailedToStart 執行手冊來確定問題。您必須在 Amazon ECS 叢集資源所在的相同 AWS 區域中使用執行手冊。另外,請使用最近失敗的任務 ID。如果失敗的任務屬於 Amazon ECS 服務,請在服務中使用最近失敗的任務。失敗的任務必須在 ECS:DescribeTasks 自動化過程中顯示。預設情況下,已停止的 ECS 任務在進入已停止狀態後會在 1 小時內顯示。

根據自動化的輸出,使用下列其中一個手動疑難排解步驟。

確定您的私人子網路具有到 NAT 閘道的路由,或使用 PrivateLink

您可以使用私有子網路來執行具有 Amazon Elastic Compute Cloud (Amazon EC2) 或 AWS Fargate 啟動類型的任務。對於這兩種啟動類型,請確認私有子網路在路由表中具有到 NAT 閘道的路由。在您的 VPC 中設定 NAT 閘道,以將請求路由至網際網路。

或者,將 AWS PrivateLink 與 虛擬私有雲端 (VPC) 端點和 Amazon Simple Storage Service (Amazon S3) 閘道端點一起使用。

VPC 端點安全群組必須允許來自私有子網路或 Amazon ECS 任務 VPC 的連接埠 443 的傳入連線。

注意: Windows 中的 ECS_IMAGE_PULL_INACTIVITY_TIMEOUT 值設定為預設的 3 分鐘。如果您要提取較大的映像檔,則映像檔提取可能無法在 3 分鐘內完成,導致請求逾時。

檢查您的 Amazon ECR 儲存庫政策

如果您的 Amazon ECR 儲存庫政策限制存取儲存庫映像檔,那麼您會收到 403 Forbidden 錯誤。請檢查您的 Amazon ECR 儲存庫政策,以確保對儲存庫映像檔沒有任何存取限制。有關存取政策的範例,請參閱 Amazon ECR 中的私人儲存庫政策範例

檢查任務執行或容器執行個體 IAM 角色的權限

如果您使用 Amazon EC2 啟動類型,請確保容器執行個體 AWS Identity and Access Management (IAM) 角色具有存取 Amazon ECR 儲存庫的權限。AmazonEC2ContainerRegistryReadOnly 政策提供了提取映像檔所需的最低權限。

如果您使用 Fargate 啟動類型,請確保將 AmazonECSTaskExecutionRolePolicy 附加到任務執行角色,以提取映像檔。

請確定您使用正確的映像檔 URI

若要確認您在 URI 中使用的映像檔名稱正確,請檢查任務定義中容器定義區段的映像檔參數

注意: 若要透過標籤提取,請使用 registry/repository[:tag] 映像檔名稱格式。若要按摘要進行提取,請使用 registry/repository[@digest] 格式,您可以直接從 Amazon ECR 儲存庫中複製該格式。

檢查您的磁碟空間

如果沒有足夠的磁碟空間來儲存您提取的映像檔,那麼您會收到「CannotPullContainerError:裝置上沒有剩餘空間」錯誤訊息。若要解決該問題,請參閱寫入 /var/lib/docker/tmp/GetImageBlob111111111:裝置上沒有剩餘空間

檢查您是否超過提取率配額

如果您使用 Docker Hub 提取映像檔並超出映像檔提取配額,則會收到「CannotPullContainerError:toomanyrequests: 您已達到提取率限制」錯誤訊息。如需提取率配額的資訊,請參閱 Docker Docs 網站上的提取率限制。若要解決此問題,請參閱錯誤:toomanyrequests: 請求過多或您已達到提取率限制

檢查您的網路設定

如果您的任務與 Amazon ECR 端點之間缺少網路路徑,則您會收到類似以下的錯誤範例:

「Cannotpullcontainererror:常駐程式的錯誤回應」

- 或 -

「等待標頭時超過 Client.Timeout」

若要解決此問題,請檢查您的任務是否可以透過 NAT 閘道或 PrivateLink 存取 Amazon ECR 儲存庫。

建立 Amazon ECS 服務時,請在 Networking (網路) 下設定以下設定:

  • 對於公用子網路中的任務,在 Public IP (公用 IP) 中啟用 Auto-assign public IP (自動指定公用 IP)。
  • 對於私有子網路中的任務,請停用 Auto-assign public IP (自動指派公用 IP),然後設定 NAT 閘道或 PrivateLink。

更新您的 Docker 登入憑證

如果您的 Docker 憑證已過期,那麼您會收到「儲存庫不存在或可能需要『Docker 登入』」錯誤訊息。若要更新私有儲存庫驗證的 Docker 登入憑證,請參閱使用授權權杖

相關資訊

Amazon ECS 中的 CannotPullContainer 任務錯誤

AWS 官方
AWS 官方已更新 2 個月前