use*_*852 14 docker docker-registry
我们的CI-CD中有逻辑标记(通过REST)将图像分级到最新(如果测试成功).这适用于注册表v1.
现在转移到v2 api,我在文档中找不到如何在注册表中"添加"标签到现有图像..我在一个步骤,可以带来一些临时图像的"清单",但不知道如何添加标签和http发布它.试图发送以下输入
"tag":"staging","latest",
"tag":["staging","latest"]等等
{"schemaVersion":1,"name":"configservice","tag":"staging","architecture":"amd64","fsLayers":[....
whe*_*eph 13
如果您拥有支持清单架构版本2的Docker Registry,则只需在新标记下上载现有图像的清单即可.
例如,假设您要标记最新版本的busybox图像.步骤将是:
下载现有清单:
curl '<registry_url>/v2/mybusybox/manifests/latest' \
-H 'accept: application/vnd.docker.distribution.manifest.v2+json' \
> manifest.json
Run Code Online (Sandbox Code Playgroud)
这是清单的样子(注意schemaVersion是2):
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/octet-stream",
"size": 1459,
"digest": "sha256:2b8fd9751c4c0f5dd266fcae00707e67a2545ef34f9a29354585f93dac906749"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 667590,
"digest": "sha256:8ddc19f16526912237dd8af81971d5e4dd0587907234be2b83e249518d5b673f"
}
]
}
Run Code Online (Sandbox Code Playgroud)
在新标签下上传清单:
curl -XPUT '<registry_url>/v2/mybusybox/manifests/new_tag' \
-H 'content-type: application/vnd.docker.distribution.manifest.v2+json' \
-d '@manifest.json'
Run Code Online (Sandbox Code Playgroud)
详细的分步指南在这篇文章中给出.
这不是你问题的直接答案,但我一直做到以下......
docker pull myimage:staging
docker run myimage:staging test
docker tag myimage:staging myimage:release
docker push myimage:release
Run Code Online (Sandbox Code Playgroud)
我只是想补充一下,因为这出现在我的搜索结果中,所以 Google Container Registry 包含直接执行此操作的add-tag命令。
gcloud container images add-tag gcr.io/project/image:old-tag gcr.io/project/image:new-tag
Run Code Online (Sandbox Code Playgroud)
上面 wheleph 描述的工作流程有效,但导致创建了一个新容器,而不是将附加标签应用于现有容器。
您可以使用docker buildx imagetools create来实现此目的
docker buildx imagetools create myregistry.com/myimage:latest --tag myregistry.com/myimage:staging
Run Code Online (Sandbox Code Playgroud)
这将简单地下载图像清单myregistry.com/myimage:latest并将其重新标记(并推送)为myregistry.com/myimage:staging
注意:当您“重新标记”时(例如,当您的映像是为 linux/arm64 和 linux/amd64 构建的)时,这也将保留多平台清单列表。传统的 docker 拉/推策略将仅保留您执行拉/推操作的系统平台/架构的映像清单。
PS这是我的答案的重新发布
这个答案仅适用于更改图像标签,但我也想更改存储库名称。
感谢Nicholas Dille 的“如何标记 docker 镜像而不拉动它们”的帖子,我也能够更改repoName!在他的nicholasdille/PowerShell-RegistryDocker项目项目的帮助下:
从reg:5000/v2/{oldRepo}/manifests/{oldtag}带有标头的GETaccept清单:application/vnd.docker.distribution.manifest.v2+json
对于每一层:POST reg:5000/v2/{newRepo}/blobs/uploads/?mount={layer.digest}&from={oldRepoNameWithaoutTag}
邮政 reg:5000/v2/{newRepo}/blobs/uploads/?mount={config.digest}&from={oldRepoNameWithaoutTag}
reg:5000/v2/{newRepo}/manifests/{newTag}带标头的PUTcontent-type:application/vnd.docker.distribution.manifest.v2+json以及body来自步骤 1 的响应
享受!
| 归档时间: |
|
| 查看次数: |
5495 次 |
| 最近记录: |