如何在 ECR 中重新标记图像?
How do I re-tag an image in ECR?
我正在尝试跟随 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)来识别它们,这应该没问题。但是,指南提供的命令似乎不再起作用。它说:
Use the batch-get-image command to get the image manifest for the image to retag and write it to an environment variable. In this example, the manifest for an image with the tag, latest, in the repository, amazonlinux, is written to the environment variable, 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
),那么该命令确实会成功并且 returns 有点 JSON。因此,我尝试手动将 copy/paste 那个 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
命令。我该怎么做才能使这些命令正常工作,并为我的图像添加标签?
您收到 shell 错误 (zsh
),表明通配符表达式 images[].imageManifest
与本地磁盘上的任何文件都不匹配。
尝试使用引号:
--query 'images[].imageManifest'
而不是这个:
--query images[].imageManifest
有些相关:
aws ecr ... --output text
命令不保留空格。
当我尝试重新标记图片时,它显示了不同的摘要值。
方法不对
下面介绍macosx上的回车returns(\r\n
):
MANIFEST=$(aws ecr batch-get-image --repository-name amazonlinux --image-ids imageTag=latest --query 'images[].imageManifest' --output text)
好办法
这提取了正确的值,但需要 jq
:
MANIFEST=$(aws ecr batch-get-image --repository-name amazonlinux --image-ids imageTag=latest --output json | jq --raw-output '.images[].imageManifest')
差异
... --query 'images[].imageManifest' --output text
对
... --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', ' ').replace("`n", " ")
aws ecr put-image --repository-name REPO --image-tag 2018.12 --image-manifest "$y"
我刚刚通过了同样的问题。
# 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
我正在尝试跟随 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)来识别它们,这应该没问题。但是,指南提供的命令似乎不再起作用。它说:
Use the batch-get-image command to get the image manifest for the image to retag and write it to an environment variable. In this example, the manifest for an image with the tag, latest, in the repository, amazonlinux, is written to the environment variable, 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
),那么该命令确实会成功并且 returns 有点 JSON。因此,我尝试手动将 copy/paste 那个 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
命令。我该怎么做才能使这些命令正常工作,并为我的图像添加标签?
您收到 shell 错误 (zsh
),表明通配符表达式 images[].imageManifest
与本地磁盘上的任何文件都不匹配。
尝试使用引号:
--query 'images[].imageManifest'
而不是这个:
--query images[].imageManifest
有些相关:
aws ecr ... --output text
命令不保留空格。
当我尝试重新标记图片时,它显示了不同的摘要值。
方法不对
下面介绍macosx上的回车returns(\r\n
):
MANIFEST=$(aws ecr batch-get-image --repository-name amazonlinux --image-ids imageTag=latest --query 'images[].imageManifest' --output text)
好办法
这提取了正确的值,但需要 jq
:
MANIFEST=$(aws ecr batch-get-image --repository-name amazonlinux --image-ids imageTag=latest --output json | jq --raw-output '.images[].imageManifest')
差异
... --query 'images[].imageManifest' --output text
对
... --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', ' ').replace("`n", " ")
aws ecr put-image --repository-name REPO --image-tag 2018.12 --image-manifest "$y"
我刚刚通过了同样的问题。
# 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