如何在docker registry v2中标记图像

use*_*852 14 docker docker-registry

我们的CI-CD中有逻辑标记(通过REST)将图像分级到最新(如果测试成功).这适用于注册表v1.

现在转移到v2 api,我在文档中找不到如何在注册表中"添加"标签到现有图像..我在一个步骤,可以带来一些临时图像的"清单",但不知道如何添加标签和http发布它.试图发送以下输入

  1. "tag":"staging","latest",

  2. "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)

详细的分步指南在这篇文章中给出.

  • 如果网站出现故障,您应该在此处发布说明 - http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers (3认同)

Pau*_*tte 8

这不是你问题的直接答案,但我一直做到以下......

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)

  • 这绝对是一个有效的解决方案,但它需要具有docker二进制文件,可能以root身份运行它.此外,它可能需要相当长的时间,因为它涉及图像下载. (3认同)
  • 基于这个问题,我们正在对映像运行测试以验证它 - 因此它必须已经存在(在CI计算机上已经构建或下载).这并没有引入任何额外的关注,"测试"步骤没有(仅仅是第二次"docker push"的延迟,这在一次重拍时非常快. (3认同)

Mik*_*kel 7

我只是想补充一下,因为这出现在我的搜索结果中,所以 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 描述的工作流程有效,但导致创建了一个新容器,而不是将附加标签应用于现有容器。

  • 以下是如何在 AWS 中执行相同操作:https://davin.ninja/amazon-ecr-adding-tag-image-already-pushed (2认同)

Fra*_*Nel 6

您可以使用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这是我的答案的重新发布


Neg*_*iri 5

这个答案仅适用于更改图像标签,但我也想更改存储库名称

感谢Nicholas Dille 的“如何标记 docker 镜像而不拉动它们”的帖子,我也能够更改repoName在他的nicholasdille/PowerShell-RegistryDocker项目项目的帮助下:

  1. 获取清单(在 v2 架构中)
  2. 在新仓库中发布每个layer.digest
  3. 后配置层
  4. 将整个清单放入新仓库

细节:

  1. reg:5000/v2/{oldRepo}/manifests/{oldtag}带有标头的GETaccept清单:application/vnd.docker.distribution.manifest.v2+json

  2. 对于每一层:POST reg:5000/v2/{newRepo}/blobs/uploads/?mount={layer.digest}&from={oldRepoNameWithaoutTag}

  3. 邮政 reg:5000/v2/{newRepo}/blobs/uploads/?mount={config.digest}&from={oldRepoNameWithaoutTag}

  4. reg:5000/v2/{newRepo}/manifests/{newTag}带标头的PUTcontent-typeapplication/vnd.docker.distribution.manifest.v2+json以及body来自步骤 1 的响应

  5. 享受!