ECS Fargate 任务失败:CannotPullContainerError:检查图像已重试 5 次:httpReaderSeeker:打开失败:意外状态代码

ric*_*low 7 amazon-web-services amazon-ecs docker dockerhub aws-fargate

我们正在运行其他 ECS 服务,这些服务使用我们的私有 ECR 存储库中的映像。然而,对于同一集群中尝试从 Docker Hub 拉取的服务,我们收到以下错误:

CannotPullContainerError:检查图像已重试 5 次:httpReaderSeeker:打开失败:意外状态代码 https://registry-1.docker.io...:4...

(消息本身在末尾被截断:它实际上是“4...”)。

从它收到状态代码响应的事实来看,这表明它能够与 Docker Hub 通信,并且这不是我们的 AWS 配置中的网络连接问题。我们正在尝试在我们的 ECS 任务中使用来自公共存储库的图像,一个是 Redis 图像,另一个是 Hasura 图像。我不确定如何查看状态代码本身,因为它在 AWS 控制台中被截断。

当我在浏览器中点击错误中的URL时,响应如下:

{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"repository","Class":"","Name":"hasura/graphql-engine","Action":"pull"}]}]}
Run Code Online (Sandbox Code Playgroud)

我通过 Redis 镜像得到了类似的响应。我认为我们不需要任何身份验证来提取公共镜像 - 我们过去运行 ECS 任务不需要对 Docker Hub 进行身份验证?

为了完整起见,我添加了以下检查来解决此错误,但是如上所述,由于我们从 Docker Hub 获取响应代码,因此这些检查看起来并不相关。

AWS 有本指南来解决“CannotPullContainer”错误,对于 Fargate 上的这个特定错误,有本指南。以下是我们检查过的指南中的内容:

确认您的 VPC 网络配置允许您的 Amazon ECS 基础设施访问映像存储库

此 ECS 任务位于私有子网中,其路由表具有以下路由:

10.0.0.0/16 -> local (active)
0.0.0.0/0 -> NAT Gateway (active)
Run Code Online (Sandbox Code Playgroud)

NAT 网关处于可用状态并分配了弹性 IP 地址。

检查VPC DHCP选项集

查看 VPC 并转到 DHCP 选项集,我们可以看到域名服务器设置为:“AmazonProvidedDNS”

检查任务执行角色权限 有关配置此功能的更多详细信息,请参阅本指南

“任务角色”和“任务执行角色”的任务定义中使用相同的 IAM 角色。这是使用上述指南中定义的以下默认策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents",
                "logs:CreateLogStream",
                "ecr:GetDownloadUrlForLayer",
                "ecr:GetAuthorizationToken",
                "ecr:BatchGetImage",
                "ecr:BatchCheckLayerAvailability"
            ],
            "Resource": "*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

检查图像是否存在

这是我们尝试从 Docker Hub 中提取的镜像。该图像存在,我可以从本地计算机中提取它,而无需进行身份验证。

小智 8

我遇到了同样的问题,并花了一整天的时间寻找我的配置中的错误。

事实证明,DockerHub 阻止了我的 ECS 任务拉取 docker 镜像的请求https://www.docker.com/increase-rate-limits

如果您从 DockerHub 提取镜像并遇到同样的问题,只需等待 6 小时或创建一个新集群,该集群将为您提供新的 IP 地址。