Amazon web services 如何在ECR中重新标记图像?
我试着跟随,并且开始怀疑这本指南已经过时了。我将许多Docker图像推送到ECR存储库中,我们称之为“myappserver” 因此,我可以运行如下命令来查看ECR存储库中所有图像的列表:Amazon web services 如何在ECR中重新标记图像?,amazon-web-services,amazon-ecs,Amazon Web Services,Amazon Ecs,我试着跟随,并且开始怀疑这本指南已经过时了。我将许多Docker图像推送到ECR存储库中,我们称之为“myappserver” 因此,我可以运行如下命令来查看ECR存储库中所有图像的列表: aws ecr describe-images --repository-name myappserver 我从该命令获得的输出如下所示: { "imageDetails": [ { "registryId": &quo
aws ecr describe-images --repository-name myappserver
我从该命令获得的输出如下所示:
{
"imageDetails": [
{
"registryId": "123456789012",
"repositoryName": "myappserver",
"imageDigest": "sha256:1234...",
"imageSizeInBytes": 33805114,
"imagePushedAt": 1525881170.0
},
{
"registryId": "123456789012",
"repositoryName": "myappserver",
"imageDigest": "sha256:1234...",
"imageTags": [
"latest"
],
"imageSizeInBytes": 333805137,
"imagePushedAt": 1525892193.0
},
...
]
}
因为不再是所有的图像都有标签,所以我想通过imageDigest(而不是像指南中那样的imageTag)来识别它们,这应该很好。然而,指南提供的命令似乎不再有效。它说:
使用批处理获取图像命令获取要重新标记的图像的图像清单,并将其写入环境变量。在本例中,存储库amazonlinux中带有标签latest的图像的清单将写入环境变量manifest
清单=$(aws ecr批处理获取图像--存储库名称amazonlinux--图像ID imageTag=最新--查询图像[]。图像清单--输出文本)
因此,很自然,我尝试运行以下命令:
aws ecr batch-get-image --repository-name myappserver --image-ids imageDigest=sha256:1234... --query images[].imageManifest --output text
aws ecr put-image --repository-name myappserver --image-tag new-tag --image-manifest "$MANIFEST"
但我在终点站得到的反应是:
zsh: no matches found: images[].imageManifest
有趣的是,如果我省略了最后两个参数(--query images[].imageManifest
和--output text
),那么该命令会成功并返回一点JSON。因此,我尝试手动将JSON复制/粘贴到一个环境变量中,特别是复制标记为“imageManifest”的部分。然后,使用该环境变量(我将其命名为MANIFEST
,以与指南使用的术语保持一致),我尝试运行以下命令:
aws ecr batch-get-image --repository-name myappserver --image-ids imageDigest=sha256:1234... --query images[].imageManifest --output text
aws ecr put-image --repository-name myappserver --image-tag new-tag --image-manifest "$MANIFEST"
但是,这会导致以下错误消息:
An error occurred (InvalidParameterException) when calling the PutImage operation: Invalid parameter at 'ImageManifest' failed to satisfy constraint: 'Invalid JSON syntax'
据我所知,我复制到
put image
命令中的JSON输出是有效的,尽管存在错误。我也很困惑为什么不能用提供的参数运行batch get image
命令。如何才能使这些命令正常工作并向我的映像添加标记?您收到一个shell错误(zsh
),该错误表示通配符表达式images[]。imageManifest
与本地磁盘上的任何文件都不匹配
尝试使用引号:
--query 'images[].imageManifest'
与此相反:
--query images[].imageManifest
有些相关:
我看到重新标记的图像具有不同的摘要值。这是因为aws ecr--输出文本不保留空白
即
在macosx上引入了回车(\r\n
)
因此,最好使用jq
获取准确的值:
MANIFEST=$(aws ecr batch-get-image --repository-name amazonlinux --image-ids imageTag=latest --output json | jq --raw-output '.images[].imageManifest')
对于windows中的用户,我需要在JSON上做一些调整
$MANIFEST = aws ecr batch-get-image --repository-name REPO --image-ids "imageDigest=sha256:DIGEST" --query 'images[].imageManifest' --output json
$x = $MANIFEST | ConvertFrom-Json
$y = $x.replace('\n', ' ')
aws ecr put-image --repository-name REPO --image-tag 2018.12 --image-manifest "$y"
我刚刚路过同样的问题
#此脚本使用diggest标记未标记的ECR图像
ECR_REPO=我的ECR REPO名称
IMAGE_DIGEST=“sha256:AB6DSA4F1F940DF430062009FDFB02D3EDE74B48E39AD939047C2E7D0EE3AC50D8”
标签=我的标签
# ---
清单=$(aws ecr批处理获取图像--存储库名称$ecr_REPO--图像ID imageDigest=$image_DIGEST--查询'images[].imageManifest'--输出文本)
aws ecr put映像--存储库名称$ecr_REPO--映像标记$tag--映像清单“$manifest”
你可以看到要点:
确认。只要我加上引号,任何一个都可以工作。谢谢