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
以下是我为解决该问题所采取的步骤(如果您不想观看视频):
- 创建一个选中“访问密钥”的新 IAM 用户
- 在权限下,单击“直接附加现有策略”并选择“AmazonEC2ContainerRegistryFullAccess”
- 下载 CSV 文件
- 运行 在您的终端上“AWS 配置”并传入 CSV 文件中的凭据
- 将位置设置为您创建 ECR 的位置(我的是 us-east-1)
- 进入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 找不到它。
我正在尝试将我的第一个 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
以下是我为解决该问题所采取的步骤(如果您不想观看视频):
- 创建一个选中“访问密钥”的新 IAM 用户
- 在权限下,单击“直接附加现有策略”并选择“AmazonEC2ContainerRegistryFullAccess”
- 下载 CSV 文件
- 运行 在您的终端上“AWS 配置”并传入 CSV 文件中的凭据
- 将位置设置为您创建 ECR 的位置(我的是 us-east-1)
- 进入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 找不到它。