无需下载镜像即可完成标记,2个简单调用轻松帮您提升效率!
出品丨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 的优点是无需下载镜像。镜像清单只有几千字节。因此,使用标记这种方法可以大大地提升效率。
使用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>”。
点击下列标题,阅读更多干货
如果本文对你有帮助,欢迎分享到朋友圈!获取更多Docker实用技巧,扫描下图二维码!