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