Docker 推送到 AWS ECR 立即挂起并超时

Docker push to AWS ECR hangs immediately and times out

我正在尝试将我的第一个 docker 图像推送到 ECR。我已经按照 AWS 提供的步骤进行操作,事情似乎进展顺利,直到最后一次推送立即超时。具体来说,我将我的 aws ecr 凭据传递给 docker 并收到“登录成功”消息。然后我标记也有效的图像。推送到 ecr 回购我没有收到错误消息,只有以下内容:

The push refers to repository [xxxxxxxxxxx.dkr.ecr.ca-central-1.amazonaws.com/reponame]
714c1b96dd83: Retrying in 1 second 
d2cdc77dd068: Retrying in 1 second 
30aad807caf5: Retrying in 1 second 
0559774c4ea2: Retrying in 1 second 
285b8616682f: Retrying in 1 second 
4aeea0ec2b15: Waiting 
1b1312f842d8: Waiting 
c310009e0ef3: Waiting 
a48777e566d3: Waiting 
2a0c9f28029a: Waiting 
EOF

它尝试了很多次,然后没有任何消息退出。知道出了什么问题吗?

我解决了我的问题。我没有使用正确的凭据。我有一个个人 AWS 账户作为我的默认凭证,需要将我的工作资料添加到我的凭证中。

编辑
如果您有多个 aws 配置文件,您可以在 docker 登录时提及配置文件名称,如下所示(假设您在早些时候完成了 aws configure --profile someprofile),

aws ecr get-login-password --region us-east-1 --profile someprofile | docker login ....

我必须为遇到此问题的其他人添加。转到 IAM 并确保您已设置权限。我不想说我浪费了多长时间才弄明白。

对我来说,我不得不删除堆栈并重新部署堆栈。然后,我能够将 docker 图像推送到 ECR。

同时确保您为您的用户配置了正确的策略——例如,AmazonEC2ContainerRegistryFullAccess。

在我的案例中,它与 MFA (Multi-Factor-Authentication) 有关。 我必须创建一个会话令牌。 docker好像登录成功了,但是推送不成功

以下脚本为您完成所有工作并创建用于登录的 aws 配置文件“mfa”:get_mfa_credentials.py

执行后,您可以登录:

aws ecr get-login-password --region <YOUR_REGION> --profile mfa | docker login --username AWS --password-stdin <Your_REPO>

我不知道是谁写的,但是我很感谢这个人。

还要感谢 AWS 提供的糟糕工具无济于事。

如果您在推送之前忘记创建 ECR 存储库,您将得到相同的行为。

使用 CloudTrail 了解问题所在。

我也可以登录注册中心,但是推送图片会超时。

我的解决方案是将 AmazonEC2ContainerRegistryFullAccess 添加到我的 IAM 用户。

将该权限添加到我的 IAM 用户帐户后,我就可以 docker push 到 ECS 注册表了。

如果有人仍然被这个问题困扰。我强烈推荐观看这个简短的视频 https://www.youtube.com/watch?v=89ZeXaZEf80&ab_channel=IdenticalCloud

以下是我为解决该问题所采取的步骤(如果您不想观看视频):

  1. 创建一个选中“访问密钥”的新 IAM 用户
  2. 在权限下,单击“直接附加现有策略”并选择“AmazonEC2ContainerRegistryFullAccess”
  3. 下载 CSV 文件
  4. 运行 在您的终端上“AWS 配置”并传入 CSV 文件中的凭据
  5. 将位置设置为您创建 ECR 的位置(我的是 us-east-1)
  6. 进入ECR,按照步骤推送镜像

在我的例子中,我想要推送到的存储库不存在(例如,我尝试推送到 my-app/backend:latest 但只有 my-app/cms 存储库存在)。因此,请确保您的存储库存在于正确区域的 AWS ECR 控制台 中。从 AWS CLI (EOF) 返回的错误根本没有帮助。

检查您的 aws 权限。除了 AmazonEC2ContainerRegistryFullAccess 权限外,还必须为正确的资源授予以下操作。特别检查 "arn:aws:ecr:${REGION}:${ACCOUNT_ID}:repository/{$REGISTRY_NAME}" 部分。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecr:BatchGetImage",
        "ecr:BatchCheckLayerAvailability",
        "ecr:CompleteLayerUpload",
        "ecr:DescribeImages",
        "ecr:DescribeRepositories",
        "ecr:GetDownloadUrlForLayer",
        "ecr:InitiateLayerUpload",
        "ecr:ListImages",
        "ecr:PutImage",
        "ecr:UploadLayerPart"
      ],
      "Resource": "arn:aws:ecr:${REGION}:${ACCOUNT_ID}:repository/{$REGISTRY_NAME}"
    },
    {
      "Effect": "Allow",
      "Action": "ecr:GetAuthorizationToken",
      "Resource": "*"
    }
  ]
}

请检查 Cloud Trail 事件日志,所有 api 问题都在这里清楚地突出显示。

在我的例子中,这是因为我的图像名称中有一个 -,因此它在云跟踪日志中抛出以下错误

"The repository with name 'myimage-nginx' does not exist in the registry with id '516583196897'

请注意图片名称中的-

修复图像名称以删除 - 解决了我的问题。

命令

docker tag nginx:latest 516583196897.dkr.ecr.ap-south-1.amazonaws.com/myimage:latest

docker push 516583196897.dkr.ecr.ap-south-1.amazonaws.com/myimage:latest

在我的例子中,我在 us-east-2 中创建了 repo 并试图推送到 us-east-1,所以 docker 找不到它。