无需下载镜像即可完成标记,2个简单调用轻松帮您提升效率!

9d4a42b0c43260be8f2131ca096b58cb.jpeg

出品丨Docker公司(ID:docker-cn)

编译丨小东

每周一、三、五晚6点10分  与您不见不散!

说在前面

在研究多个镜像的层合并时,我意识到Docker Registry API 也可以用来标记镜像,不需要上传或下载整个镜像。接下来,让我们简单了解一下它的原理。

&

了解 Docker Registry API

Docker镜像由一个或多个层组成。每个层都是由Dockerfile中的命令创建的。根据规则,每个语句都会向镜像添加其他的层。

从 Docker Registry API 的角度来看,一个镜像包含三种类型的数据:

  • 层由 blobs 表示;

  • 来自 Dockerfile 和创建层的命令也会记录在这些存储着 blobs 的镜像配置中;

  • 镜像清单引用所有层的 blob 以及镜像配置;

在 Docker Registry 的命名中,镜像仓库存储着具有相同名称但不同标签的所有镜像的层和镜像配置(例如:“docker:18.06”和“docker:stable-dind”来自同一个镜像仓库,但“library/ docker-dev”中的所有镜像都位于第二个镜像仓库中)。请注意,镜像仓库中的镜像可能存在较大的差异(例如:“docker:18.06”和“docker:stable-dind”)。

只有镜像清单存储在标记名称下。它用了层的 blob 以及镜像配置。因此,下载一个标记的镜像清单,然后将其上传到另一个标记中,其效果与运行 docker pull 后紧随着 docker标记后紧跟着 docker push 相同。使用 API 的优点是无需下载镜像。镜像清单只有几千字节。因此,使用标记这种方法可以大大地提升效率。

71aa48bcc2450f4959685ba8702038bf.png

使用curl进行远程标记

使用curl远程标签时,可以通过以下两个调用来实现:

#!/bin/bash

REGISTRY_NAME="http://localhost:5000"

REPOSITORY=rd/dind

TAG_OLD=25

TAG_NEW=stable

CONTENT_TYPE="application/vnd.docker.distribution.manifest.v2+json"

MANIFEST=$(curl -H "Accept: ${CONTENT_TYPE}" "${REGISTRY_NAME}/v2/${REPOSITORY}/manifests/${TAG_OLD}")

curl -X PUT -H "Content-Type: ${CONTENT_TYPE}" -d "${MANIFEST}" "${REGISTRY_NAME}/v2/${REPOSITORY}/manifests/${TAG_NEW}"

请注意,上述解决方案不实现任何类型的身份验证。对于基本身份验证,添加 -u “<user>:<pass>”并首先为 Docker Hub 申请获取令牌,然后添加-H“Authorization:Bearer <token>”。

a4c43949e99d52faa5e701043784ed2a.png

点击下列标题,阅读更多干货

如果本文对你有帮助,欢迎分享到朋友圈!获取更多Docker实用技巧,扫描下图二维码!

    710d55d2d4dfc79747f26c87c1c40cd3.jpeg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值