使用 Amazon ECR 时通过 Docker 命令纠正错误 - Amazon ECR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

使用 Amazon ECR 时通过 Docker 命令纠正错误

有时,针对 Amazon ECR 运行 Docker 命令可能导致错误消息。一些常见错误消息和可能的解决办法解释如下。

从 Amazon ECR 存储库提取镜像时,出现错误:“Filesystem Verification Failed”(文件系统验证失败) 或“404: Image Not Found”(404:找不到镜像)

在 Docker 1.9 或更高版本中使用 docker pull 命令从 Amazon ECR 存储库提取镜像时,可能会收到错误 Filesystem verification failed。如果使用的是 1.9 之前的 Docker 版本,则可能收到错误 404: Image not found

以下为一些可能的原因及它们的解释。

本地磁盘已满

如果运行 docker pull 命令的本地磁盘已满,那么对本地文件计算的 SHA-1 哈希值可能与 Amazon ECR 计算的 SHA-1 哈希值不同。确保本地磁盘有足够的剩余空间可存储所提取的 Docker 镜像。为腾出空间存储新镜像,可以删除旧镜像。使用 docker images 命令可查看所有已下载到本地的 Docker 镜像的列表及这些镜像的大小。

由于网络错误,客户端无法连接到远程存储库

调用 Amazon ECR 存储库需要 Internet 连接正常。验证网络设置,然后验证其他工具和应用程序是否可以访问 Internet 上的资源。如果在私有子网中对 Amazon EC2 实例运行 docker pull,请验证该子网是否具有连接至 Internet 的路由。可使用网络地址转换 (NAT) 服务器或托管的 NAT 网关。

目前,对 Amazon ECR 存储库的调用还要求通过您的公司防火墙访问 Amazon Simple Storage Service (Amazon S3)。如果贵企业或组织使用的是允许服务终端节点的防火墙软件或 NAT 设备,请确保当前区域的 Amazon S3 服务终端节点在允许范围内。

如果您通过 HTTP 代理使用 Docker,可以对 Docker 进行相应的代理设置。有关更多信息,请参阅 Docker 文档中的 HTTP 代理

从 Amazon ECR 提取镜像时,出现错误:“Filesystem Layer Verification Failed”(文件系统分层验证失败)

您可能在使用 image image-name not found 命令提取镜像时收到错误 docker pull。如果检查 Docker 日志,可能会看到与下面类似的错误:

filesystem layer verification failed for digest sha256:2b96f...

此错误表示镜像的一个或多个层下载失败。以下为一些可能的原因及它们的解释。

您正在使用旧版本的 Docker

在使用低于 1.10 的 Docker 版本时,有少数情况会出现此错误。请将您的 Docker 客户端升级至 1.10 或更高版本。

您的客户端遇到网络错误或磁盘错误

如前文对 Filesystem verification failed 消息的讨论中所述,磁盘已满或网络问题可能会导致一个或多个层无法下载。请遵循上述建议确保您的文件系统未满,并且您在网络中有对 Amazon S3 的访问权限。

使用拉取缓存规则进行拉取时出错

使用拉取缓存规则拉取上游镜像时,您可能会收到以下常见错误。

存储库不存在

指示存储库不存在的错误通常是由该存储库不存在于 Amazon ECR 私有注册表中或者未向拉取上游镜像的 IAM 主体授予 ecr:CreateRepository 权限所致。要解决此错误,您应该验证拉取命令中的存储库 URI 正确,已向拉取上游镜像的 IAM 主体授予所需的 IAM 权限,或者在执行上游镜像拉取之前,已在您的 Amazon ECR 私有注册表中创建要向其推送上游镜像的存储库。有关所需 IAM 权限的更多信息,请参阅 所需的 IAM 权限

以下是此错误的示例。

Error response from daemon: repository 111122223333.dkr.ecr.us-east-1.amazonaws.com/ecr-public/amazonlinux/amazonlinux not found: name unknown: The repository with name 'ecr-public/amazonlinux/amazonlinux' does not exist in the registry with id '111122223333'
找不到请求的镜像

指示找不到镜像的错误通常是由该镜像不存在于上游注册表中或者未向拉取上游镜像的 IAM 主体授予 ecr:BatchImportUpstreamImage 权限但已在 Amazon ECR 私有注册表中创建存储库所致。要解决此错误,您应验证上游镜像和镜像标签名称正确且存在,并且已向拉取上游镜像的 IAM 主体授予所需的 IAM 权限。有关所需 IAM 权限的更多信息,请参阅 所需的 IAM 权限

以下是此错误的示例。

Error response from daemon: manifest for 111122223333.dkr.ecr.us-east-1.amazonaws.com/ecr-public/amazonlinux/amazonlinux:latest not found: manifest unknown: Requested image not found

推送到存储库时出现 HTTP 403 错误或“no basic auth credentials”(没有基础级验证凭证) 错误

有时,即使您已使用 aws ecr get-login-password 命令成功通过 Docker 身份验证,也可能会从 docker pushdocker pull 命令收到 HTTP 403 (Forbidden) 错误或者错误消息 no basic auth credentials。以下是此问题的一些已知的原因:

您已验证到其他区域

身份验证请求与特定的区域相关联,不能跨区域使用。例如,如果您从美国西部 (俄勒冈) 获得授权令牌,不能使用它对您在美国东部 (弗吉尼亚北部) 的存储库进行身份验证。要解决此问题,请确保您已从存储库所在的同一区域检索了身份验证令牌。有关更多信息,请参阅 私有注册表身份验证

您已进行身份验证以推送到您没有权限的存储库

您没有必要的权限来推送到存储库。有关更多信息,请参阅 私有存储库策略

您的令牌已过期。

对于使用 GetAuthorizationToken 操作获取的令牌,默认授权令牌有效期为 12 小时。

wincred 凭证管理器中的错误

某些版本的适用于 Windows 的 Docker 使用名为 wincred 的凭证管理器,但它无法正确处理由 aws ecr get-login-password 生成的 Docker 登录命令 (有关更多信息,请参阅 https://github.com/docker/docker/issues/22910)。可以运行作为输出的 Docker 登录命令,但如果尝试推送或提取镜像,这些命令会失败。修复这个错误的方法是,对于从 aws ecr get-login-password 输出的 Docker 登录命令,删除其注册表参数中的 https:// 方案。如下所示为不带 HTTPS 方案的 Docker 登录命令示例。

docker login -u AWS -p <password> <aws_account_id>.dkr.ecr.<region>.amazonaws.com