如何在ECR中重新标记图像?

时间:2018-05-09 20:16:12

标签: amazon-web-services amazon-ecs

我正在尝试跟随Retagging an Image with the AWS CLI并开始怀疑这个指南已经过时了。我将一些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),这应该没问题。但是,指南提供的命令似乎不再起作用。它说:

  

使用batch-get-image命令获取要重新映像的图像清单,并将其写入环境变量。在此示例中,存储库amazonlinux中带有最新标记的图像的清单将写入环境变量MANIFEST。

     

MANIFEST = $(aws ecr batch-get-image --repository-name amazonlinux --image-ids imageTag = latest --query images [] .imageManifest --output text)

所以,当然,我尝试运行这个命令:

aws ecr batch-get-image --repository-name myappserver --image-ids imageDigest=sha256:1234... --query images[].imageManifest --output text

但我在终端得到的回应是:

zsh: no matches found: images[].imageManifest

有趣的是,如果我省略最后两个参数(--query images[].imageManifest--output text),那么该命令会成功并返回一些JSON。所以我尝试将JSON手动复制/粘贴到环境变量中 - 特别是复制标记为“imageManifest”的部分。然后,使用该环境变量(我将其命名为MANIFEST以保持与指南使用的命名法一致),我尝试运行此命令:

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命令。我该怎么做才能使这些命令工作,并为我的图像添加标签?

4 个答案:

答案 0 :(得分:4)

试试这段代码:

--query 'images[0].imageManifest'

而不是:

--query images[].imageManifest

答案 1 :(得分:0)

有些相关:

我看到重新标记的图像具有不同的摘要值。这是因为aws ecr ... --output text不保留空格。

IE。

MANIFEST=$(aws ecr batch-get-image --repository-name amazonlinux --image-ids imageTag=latest --query 'images[].imageManifest' --output text)

在macosx上引入了回车符(\r\n)。

因此,最好使用jq来获取确切的值:

MANIFEST=$(aws ecr batch-get-image --repository-name amazonlinux --image-ids imageTag=latest --output json | jq --raw-output '.images[].imageManifest')

答案 2 :(得分:0)

对于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"

答案 3 :(得分:0)

我刚刚通过了同样的问题。

# This script tags a untagged ECR Images using its diggest
ECR_REPO=my-ecr-repo-name
IMAGE_DIGEST="sha256:ab6DSA4f1f940df430062009fdfb02d3ede74b48e39ada939047c2e7d0ee3ac50d8"
TAG=my-tag
# ---
MANIFEST=$(aws ecr batch-get-image --repository-name $ECR_REPO --image-ids imageDigest=$IMAGE_DIGEST --query 'images[].imageManifest' --output text)
aws ecr put-image --repository-name $ECR_REPO --image-tag $TAG --image-manifest "$MANIFEST"

你可以看到要点:

https://gist.github.com/anderson-marques/38b802189bb8bc1cf37299cc60d653d4