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

Jes*_*mey 192 command-line-interface docker amazon-ecr

我正在尝试将我的第一个 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
Run Code Online (Sandbox Code Playgroud)

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

Jes*_*mey 167

我弄清楚了我的问题。我没有使用正确的凭据。我有一个个人 AWS 账户作为我的默认凭证,需要将我的工作配置文件添加到我的凭证中。

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

aws ecr get-login-password --region us-east-1 --profile someprofile | docker login ....
Run Code Online (Sandbox Code Playgroud)

  • 有同样的错误,但我的问题是用户没有正确的权限。 (5认同)
  • 就我而言,AWS 账户的 ECR 权限设置为 *(全部)。但我仍然面临这个问题 (2认同)

小智 110

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

使用 CloudTrail 来了解问题所在。


小智 50

确保存储库的名称与图像的名称相同。 image:latest 756839881602.dkr.ecr.us-east-1.amazonaws.com/image:latest在这种情况下,我的存储库名称是image,我的图像名称image也是。这对我有用。

  • 存储库用于一张图像。您推送的图像必须使用存储库的确切名称进行标记。 (7认同)
  • 这也是吸引我的原因。奇怪的是 ECR 存储库名称必须与 docker 镜像名称相同。 (3认同)
  • 这也发生在我身上,ECR“存储库名称”==“容器映像名称”是非常不直观的,这不是 docker 的工作方式。`push` 应该能够在存储库中创建图像,无论其名称如何。 (2认同)

Kir*_*hin 30

另请确保您已为用户 \xe2\x80\x94 配置正确的策略,例如 AmazonEC2ContainerRegistryFullAccess。

\n


son*_*xqt 18

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


小智 17

我必须为遇到此问题的其他人添加。转到 IAM 并确保您具有放置权限。我不想说我浪费了多长时间才弄清楚这一点。

编辑以帮助@zac的答案:需要附加的策略是AmazonEC2ContainerRegistryFullAccessAWSAppRunnerServicePolicyForECRAccess

  • 通过额外的支持信息可以改进您的答案。请[编辑]添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以[在帮助中心](/help/how-to-answer)找到有关如何写出好的答案的更多信息。 (3认同)

Ste*_*ers 13

就我而言,它与 MFA(多重身份验证)有关。我必须创建一个会话令牌。docker登录看似成功,但是push不起作用。

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

执行后,您可以通过以下方式登录:

aws ecr get-login-password --region <YOUR_REGION> --profile mfa | docker login --username AWS --password-stdin <Your_REPO>
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这应该得到更多支持,如果您不需要任何脚本,您可以按照来自亚马逊本身的本教程 https://aws.amazon.com/premiumsupport/knowledge-center/authenticate-mfa-cli/ 手动执行此操作。配置“mfa”配置文件后,只需登录 docker (2认同)

Hie*_*ieu 13

假设您已成功通过 AWS 身份验证,并且您有权读取、写入 ECR,请检查存储库是否存在

aws ecr describe-repositories --repository-name reponame
Run Code Online (Sandbox Code Playgroud)

如果您发现错误RepositoryNotFoundException,那么您将使用以下命令创建该存储库

aws ecr create-repository --repository-name reponame
Run Code Online (Sandbox Code Playgroud)

之后再尝试推一下就可以了!


ayk*_*dem 12

检查您的 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": "*"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

  • 授予“AmazonEC2ContainerRegistryFullAccess”将不再需要此处列出的其他权限,因为其效果是“允许”对资源“*”`执行“ecr:*”操作。 (4认同)

小智 7

对于那些尝试上述解决方案但不起作用的人,请确保您要推送的图像名称与存储库名称相同。


Sti*_*ian 6

确保您使用正确的配置文件并且存储库存在

使用配置文件登录的命令:aws ecr get-login-password --region <region> --profile=<profile-name> | docker login --username AWS --password-stdin <aws-account-id>.dkr.ecr.eu-west-1.amazonaws.com

如果不存在则创建存储库的命令 aws ecr describe-repositories --repository-names ${REPO_NAME} || aws ecr create-repository --repository-name ${REPO_NAME}:(来源