Amazon web services 如何在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

我试着跟随,并且开始怀疑这本指南已经过时了。我将许多Docker图像推送到ECR存储库中,我们称之为“myappserver” 因此,我可以运行如下命令来查看ECR存储库中所有图像的列表:

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”
你可以看到要点:


确认。只要我加上引号,任何一个都可以工作。谢谢