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

soa*_*gem 5 amazon-web-services amazon-ecs

我正在尝试使用 AWS CLI 重新标记图像并开始怀疑本指南已过时。我将许多 Docker 映像推送到 ECR 存储库中 - 我们称其为“myappserver”。所以我可以运行这样的命令来查看 ECR 存储库中所有图像的列表:

aws ecr describe-images --repository-name myappserver
Run Code Online (Sandbox Code Playgroud)

我从该命令获得的输出如下所示:

{
    "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
        },
        ...
    ]
}
Run Code Online (Sandbox Code Playgroud)

因为并非我的所有图像都不再有标签,所以我想通过 imageDigest(而不是像指南那样使用 imageTag)来识别它们,这应该没问题。但是,指南提供的命令似乎不再起作用。它说:

使用 batch-get-image 命令获取要重新标记的图像的图像清单并将其写入环境变量。在此示例中,存储库 amazonlinux 中带有标签 latest 的映像的清单被写入环境变量 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
Run Code Online (Sandbox Code Playgroud)

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

zsh: no matches found: images[].imageManifest
Run Code Online (Sandbox Code Playgroud)

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

aws ecr put-image --repository-name myappserver --image-tag new-tag --image-manifest "$MANIFEST"
Run Code Online (Sandbox Code Playgroud)

但是,这会导致以下错误消息:

An error occurred (InvalidParameterException) when calling the PutImage operation: Invalid parameter at 'ImageManifest' failed to satisfy constraint: 'Invalid JSON syntax'
Run Code Online (Sandbox Code Playgroud)

据我所知,我复制到put-image命令中的 JSON 输出是有效的,尽管有这个错误。而且我也很困惑为什么我无法batch-get-image使用提供的参数运行命令。我该怎么做才能使这些命令起作用,并向我的图像添加标签?

小智 5

您收到一个 shell 错误 ( zsh),表明通配符表达式images[].imageManifest与本地磁盘上的任何文件都不匹配。

尝试使用引号:

--query 'images[].imageManifest'
Run Code Online (Sandbox Code Playgroud)

而不是这个:

--query images[].imageManifest
Run Code Online (Sandbox Code Playgroud)