CannotPullContainer 任务错误 - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

CannotPullContainer 任务错误

以下错误表明,在创建任务时,无法检索指定的容器镜像。

注意

1.4 Fargate 平台版本会截断长错误消息。

连接超时

启动 Fargate 任务时,其弹性网络接口需要到互联网的路由来提取容器镜像。如果您在启动任务时收到一个类似如下的错误,则原因是到互联网的路由不存在:

CannotPullContainerError: API error (500): Get https://111122223333.dkr.ecr.us-east-1.amazonaws.com/v2/: net/http: request canceled while waiting for connection"

要解决此问题,您可以:

  • 对于在公有共子网中的任务,在启动任务时为自动分配公有 IP 指定启用。有关更多信息,请参阅创建独立任务

  • 对于在私有子网中的任务,在启动任务时为自动分配公有 IP 指定禁用,然后在 VPC 中配置 NAT 网关,将请求路由到互联网。有关更多信息,请参阅 Amazon VPC 用户指南中的 NAT 网关

上下文已取消

此错误的常见原因是,您的任务使用的 VPC 没有从 Amazon ECR 中提取容器镜像的路径。

未找到映像

在容器定义中指定一个 Amazon ECR 镜像时,必须使用 ECR 存储库的完整 ARN 或 URI 连同该镜像在该存储库中的名称。如果无法找到存储库或镜像,您将收到以下错误:

CannotPullContainerError: API error (404): repository 111122223333.dkr.ecr.us-east-1.amazonaws.com/<repo>/<image> not found

要解决此问题,请验证存储库的 URI 和镜像名称。另外,确保您已经使用任务执行 IAM 角色设置了适当的访问权限。有关任务执行角色的更多信息,请参阅Amazon ECS 任务执行 IAM 角色

Amazon ECR 端点连接问题

如果您尝试提取 Amazon ECR 映像,但您没有 Amazon ECR 端点的正确权限,则会看到与以下内容类似的错误:

CannotPullContainerError: API error

要解决此问题,Amazon ECS 必须与 Amazon ECR 端点通信。有关如何解决此问题的信息,请参阅 Amazon Web Services Support 网站上的如何解决 Amazon ECS 中的 Amazon ECR 错误 “CannotPullContainerError:API 错误”

磁盘空间不足

如果在拉取容器映像时容器实例的根卷没有足够的磁盘空间,您将看到类似以下内容的错误:

CannotPullContainerError: write /var/lib/docker/tmp/GetImageBlob111111111: no space left on device

要解决此问题,请释放磁盘空间。

如果您使用的是经过 Amazon ECS 优化的 AMI,则可以使用以下命令来检索文件系统上最大的 20 个文件:

du -Sh / | sort -rh | head -20

输出示例:

5.7G    /var/lib/docker/containers/50501b5f4cbf90b406e0ca60bf4e6d4ec8f773a6c1d2b451ed8e0195418ad0d2
1.2G    /var/log/ecs
594M    /var/lib/docker/devicemapper/mnt/c8e3010e36ce4c089bf286a623699f5233097ca126ebd5a700af023a5127633d/rootfs/data/logs
...

在某些情况下,与上面的示例类似,可以由正在运行的容器填充根卷。如果容器使用的是没有 json-file 限制的原定设置 max-size 日志驱动程序,则可能是日志文件占用了大部分已用空间。您可以使用 docker ps 命令通过将上面输出中的目录名称映射到容器 ID 来验证哪个容器占用了空间。例如:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 50501b5f4cbf amazon/amazon-ecs-agent:latest "/agent" 4 days ago Up 4 days ecs-agent

预设情况下,使用 json-file 日志驱动程序时,Docker 会捕获所有容器的标准输出(和标准错误),并使用 JSON 格式将它们写入到文件中。您可以将 max-size 设置为日志驱动程序选项,以防日志文件占用过多空间。有关更多信息,请参阅 Docker 文档中的配置日志记录驱动程序

下面的容器定义代码段说明此选项的用法:

{ "log-driver": "json-file", "log-opts": { "max-size": "256m" } }

如果容器日志占用过多磁盘空间,还有一个替代解决方案是使用 awslogs 日志驱动程序。awslogs日志驱动程序将日志发送到 CloudWatch,这会释放原本用于容器实例上的容器日志的磁盘空间。有关更多信息,请参阅使用 awslogs 日志驱动程序

Docker Hub 速率限制

如果您收到以下错误之一,则可能达到 Docker Hub 速率限制:

ERROR: toomanyrequests: Too Many Requests.
You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limits.

有关 Docker Hub 费率限制的更多信息,请参阅 了解 Docker Hub 速率限制

如果您提高了 Docker Hub 速率限制,且需要对容器实例的 Docker 拉取进行身份验证,请参阅 Amazon Elastic Container Service 开发人员指南中的容器实例的私有注册表身份验证

无法复制映像

如果在启动任务时收到类似于以下的错误,这是因为无法访问镜像:

CannotPullContainerError: ref pull has been retried 1 time(s): failed to copy: httpReaderSeeker: failed open: unexpected status code

要解决此问题,您可以:

拉取访问被拒绝

如果在启动任务时收到类似于以下的错误,这是因为无法访问镜像:

CannotPullContainerError: pull access denied

要解决此问题,您可能需要使用 Amazon ECR 对 Docker 客户端进行身份验证。有关更多信息,请参阅 Amazon ECR 用户指南中的私有注册表身份验证

内存地址无效或空指针取消引用

如果在启动任务时收到类似于以下的错误,这是因为无法访问镜像:

CannotPullContainerError: containerd: pull command failed: panic: runtime error: invalid memory address or nil pointer dereference

要解决此问题,请执行以下操作:

  • 检查您是否有访问 Amazon S3 的安全组规则。

  • 使用网关终端节点时,必须在路由表中添加路由才能访问该终端节点。

提取映像配置时出错

如果您在启动任务时收到类似于以下的错误,则原因是已达到速率限制或出现网络错误:

CannotPullContainerError: error pulling image conf/error pulling image configuration

要解决此问题,请参阅如何解决我的 Amazon ECS EC2 启动类型任务中的 CannotPullContainerError “” 错误

有关 STOPPED 错误的更多信息,请参阅 Amazon Fargate 的 Amazon Elastic Container Service 用户指南中的已停止的任务错误代码