如何解决 Amazon ECS 中的错误“CannotPullContainerError: You have reached your pull rate limit”(CannotPullContainerError:您已达到拉取速率限制)

上次更新时间:2022 年 3 月 25 日

当我尝试从 Docker Hub 拉取映像时,我的 Amazon Elastic Container Service (Amazon ECS) 任务失败并出现以下错误:

CannotPullContainerError: inspect image has been retried 5 time(s): httpReaderSeeker: failed open: unexpected status code https://registry-1.docker.io/v2/manifests/sha256:2bb501e6429 Too Many Requests - Server message: toomanyrequests: You have reached your pull rate limit.您可以通过身份验证和升级来增加限制: https://www.docker.com/increase-rate-limit

简短描述

在达到 Docker 拉取速率限制后,尝试从公有 Docker Hub 存储库中拉取映像,并返回 http 状态代码 429 时,会出现此错误。Docker Hub 使用 IP 地址对用户进行身份验证,拉取速率限制基于单个 IP 地址。对于匿名用户,速率限制设置为每个 IP 地址每 6 小时拉取 100 次。对于拥有 Docker ID 的经身份验证的用户,拉取速率设置为每 6 小时内拉取 200 次。如果您的映像拉取请求超出这些限制,这些请求将被拒绝,直到六小时时段已过。如果您正在运行 Amazon ECS/Amazon EKS 工作负载,则大部分数据将通过具有固定 IP 地址的 NAT 网关拉取。在这种情况下,当您超出拉取限制时,请求会受限制。

解决方法

使用以下解决方法之一来解决此问题。

将公有映像复制到 Amazon ECR 私有注册表

创建 Amazon Elastic Container Registry (Amazon ECR) 存储库,然后将映像推送到这个新的存储库。使用这种方法,您可以通过从 Amazon ECR 存储库中拉取映像来避免超出 Docker Hub 拉取限制。

1.    运行类似于以下内容的命令,从 Docker Hub 拉取映像:

docker pull example-image

2.    运行类似于以下内容的命令对您的 Docker 客户端进行身份验证,以访问 Amazon ECR 注册表:

aws ecr get-login-password --region eu-west-1 | docker login --username AWS --password-stdin 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com

3.    运行类似于以下内容的命令来标记要推送到存储库的映像:

docker tag myrepository:latest 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com/myrepository:latest

4.    运行类似于以下内容的命令,将 Docker 镜像推送到 Amazon ECR 注册表:

docker push 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com/myrepository:latest

5.    运行类似于以下内容的命令来更新 Docker 文件,以使用新推送的 Amazon ECR 映像作为基础映像:

FROM 1111222233334444.dkr.ecr.eu-west-1.amazonaws.com/myrepository:tag

请务必在之前的命令中替换以下内容:

  • example-image 替换为要推送的公有映像的名称
  • 1111222233334444 替换为您的账户 ID
  • myrepository:latest 替换为您的 Amazon ECR 注册表的名称
  • eu-west-1 替换为您选择的区域

验证 Docker Hub 拉取

如果您使用 Docker Hub 进行身份验证,则作为经身份验证的用户,您将有更多的速率限制,并且基于 Docker 用户名会受速率限制。您可以将您的 Docker Hub 用户名和密码作为密钥存储在 AWS Secrets Manager 中,然后使用此密钥向 Docker Hub 进行身份验证。

为 Docker Hub 凭证创建 Secrets Manager 密钥

要为您的 Docker Hub 凭证创建密钥,请使用启用私有注册表身份验证创建基本密钥部分下的说明。

更新您的任务执行 AWS Identity and Access Management (AWS IAM) 角色

要向您创建的密钥授予 Amazon ECS 任务的访问权限,您必须手动将所需的权限作为内联策略添加到任务执行角色。

1.    打开 IAM console(IAM 控制台)。

2.    在导航窗格中,选择角色

3.    在角色列表中搜索 ecsTaskExecutionRole,然后选择角色以查看附加的策略。

4.    在 Permissions(权限)选项卡上,选择 Add permissions(添加权限),然后选择 Create inline policy(创建内联策略)。

5.    在 Create policy(创建策略)页面中,选择 JSON,然后复制并粘贴以下策略:

{
 "Version": "2012-10-17",
 "Statement": [{
  "Effect": "Allow",
  "Action": [
   "secretsmanager:GetSecretValue",
   "kms:Decrypt"
  ],
  "Resource": [
   "arn:aws:secretsmanager:eu-west-1:1111222233334444:secret:dockerhub-0knT",
   "arn:aws:kms:eu-west-1:1111222233334444:key/mykey"
  ]
 }]
}

请务必在策略中替换以下内容:

  • 1111222233334444 替换为您的账户 ID
  • eu-west-1 替换为您选择的区域
  • mykey 替换为您的 AWS KMS 密钥

注意:仅当密钥不使用默认密钥且使用自定义 AWS Key Management Service (AWS KMS) 密钥时,才包含 kms:Decrypt。将自定义密钥的 ARN 添加为资源。

6.    选择 Review policy(查看策略)。

7.    对于 Name(名称),输入策略的名称 (ECSSecrets)。

8.    选择 Create policy(创建策略)。

创建使用密钥进行 Docker 身份验证的任务定义

使用使用经典控制台创建任务定义中的说明创建您的 Amazon ECS 任务定义。对于任务执行角色,请务必选择您在上一部分中更新的任务执行 IAM 角色。

Container definitions(容器定义)部分中,执行以下操作:

  1. 选择 Add container(添加容器)。
  2. 对于 Container name(容器名称),输入您的容器名称。
  3. 对于 Image(映像),输入映像的名称,或包含私有映像的路径(示例:repository-url/image.tag)。
  4. 选择 Private repository authentication(私有存储库身份验证)。
  5. 对于 Secrets Manager ARN or name(Secrets Manager ARN 或名称),请输入您创建的密钥的 ARN。
  6. 选择 Add(添加)。

创建 Amazon ECS 集群并运行 Amazon ECS 任务

创建 Amazon ECS 集群。然后,使用您在上一部分中创建的任务定义运行任务

将 Amazon ECR 公有注册表用于公有容器映像

识别您在 Docker 文件中使用的公有映像。使用适当的搜索筛选条件在 Amazon ECR 公有库中搜索这些映像。您无需进行身份验证即可浏览公有存储库和拉取映像。Amazon ECR 公有注册表包含常用的基础映像,包括操作系统、AWS 发布的映像、Kubernetes 附加组件和构件。您可以通过从 Amazon ECR 公有注册表中拉取映像来避免达到 Docker Hub 的速率限制。

您可以在任务定义中使用这些映像作为容器映像的源:

ContainerDefinitions: [
 {
 ...
 Image: 'public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest'
 ...
 }
 ]

您也可以选择将这些映像用作 Docker 文件中的基础映像:

Docker File
FROM public.ecr.aws/amazonlinux/amazonlinux:latest

升级到 Docker Pro 或 Team 订阅

您可以将计划升级到 Docker ProTeam 订阅,该订阅可在 24 小时内提供 5 万次拉取。有关定价计划的更多信息,请参阅 Docker Hub 定价


这篇文章对您有帮助吗?


您是否需要账单或技术支持?