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 指定启用。有关更多信息,请参阅在经典 Amazon ECS 控制台中运行独立任务。
-
对于在私有子网中的任务,在启动任务时为自动分配公有 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
要解决此问题,您可以:
-
有关 Fargate 任务,请参阅 如何解决 Fargate 上 Amazon ECS 任务的 "cannotpullcontainererror" 错误
。 -
有关其他任务,请参阅如何解决 Amazon ECS 任务的 "cannotpullcontainererror" 错误
。
-
有关 STOPPED 错误的更多信息,请参阅 Amazon Fargate 的 Amazon Elastic Container Service 用户指南中的已停止的任务错误代码。