ECS 代理无法成功从 ECR 拉取镜像

Posted

技术标签:

【中文标题】ECS 代理无法成功从 ECR 拉取镜像【英文标题】:ECS agent can not successfully pull image from ECR 【发布时间】:2016-11-17 12:01:54 【问题描述】:

我有一个在 VPC 中运行的 ECS 托管 EC2 实例(在其中一个私有子网中)。尝试在此实例上运行任务时,它似乎无法提取图像。据我从文档中可以看出,ECS 代理不需要特殊配置即可从存储库中提取图像。

查看 Docker 日志,我反复看到以下内容:

level=error msg="Download failed, retrying: dial tcp 54.231.17.81:443: i/o timeout"

ecs-agent 日志反复显示图像未下载:

Pulling image module="TaskEngine" image="REDACTED.dkr.ecr.us-east-1.amazonaws.com/REDACTED:latest" status="Retrying in 19 seconds"

它最终尝试运行图像,但显然失败并退出。在“集群任务”选项卡中向我提供以下消息:

STOPPED (Essential container in task exited)

amzn-ami-2016.03.e 和 amzn-ami-2016.03.d AMI 均出现此错误

是否需要应用任何特定的配置或网络规则才能从 ECR 中提取?

我们将不胜感激。

附带说明,该实例确实可以访问互联网(ping google.com 可以正常工作),当我尝试从 Docker Hub 拉取图像时,它也可以正常工作。

【问题讨论】:

IAM 配置正确吗? 是的,我正在使用附加到我命名为“ecsInstanceRole”的角色的默认 AmazonEC2ContainerServiceforEC2Role 策略此角色附加到每个 EC2 实例 你能从实例上的 bash 提示符拉取图像吗? 并非没有进一步的程序,因为推荐的 AMI 未安装 aws-cli。因此“docker pull”将不会被授权。 您可以在没有 AWS cli 的情况下进行授权。在其他地方执行 aws ecr get-login 并在 ecs 实例上运行输出以尝试手动拉取。 【参考方案1】:

要从 ECR 下载映像,容器实例需要访问 ECR/S3 端点。

如果您的子网是私有子网,您必须使用 PrivateLink 功能或必须使用 NAT 网关才能访问 ECR 端点。

如果您选择使用 PrivateLink,这包括:

    为 Amazon ECR 创建 VPC 终端节点 创建 Amazon S3 网关终端节点

如果您选择使用 NatGateway,请将所有流量路由到 NATGateway 并将 AWS IP 范围列入白名单。

参考链接:https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html

【讨论】:

以上是关于ECS 代理无法成功从 ECR 拉取镜像的主要内容,如果未能解决你的问题,请参考以下文章

AWS私有仓库ECR推送拉取镜像

从jenkins docker ecs容器中访问ecr图像

ECS如何使用最新镜像

Docker 拉取镜像失败处理

上传 druid 和 superset 镜像到 ECS

Linux相关--换新的ECS,无法使用自定义镜像,数据如何迁移