You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在不拉取镜像的情况下为Docker Hub添加标签别名

当然可以!完全不需要把镜像拉到本地就能在Docker Hub上给已有镜像添加标签别名,我给你分享几个靠谱的方法:

方法1:使用Skopeo工具(推荐)

Skopeo是专门为跨镜像仓库操作设计的工具,它可以直接在远程仓库之间复制镜像(本质上就是添加标签,因为Docker镜像的标签其实是指向镜像摘要的指针),全程不需要把镜像拉到本地。

步骤如下:

  1. 先安装Skopeo(大部分Linux发行版的包管理器里都有,比如Ubuntu用apt install skopeo,CentOS用dnf install skopeo
  2. 执行复制命令,直接给远程镜像加新标签:
skopeo copy docker://org/foo:34f8a342 docker://org/foo:latest --dest-creds 你的DockerHub用户名:你的DockerHub密码

如果不想在命令行明文输密码,可以把认证信息存在~/.docker/config.json里,Skopeo会自动读取,命令可以简化成:

skopeo copy docker://org/foo:34f8a342 docker://org/foo:latest

方法2:调用Docker Hub的REST API

如果你喜欢用脚本自动化操作,直接调用Docker Hub的API也是个好办法:

  1. 首先获取目标镜像的摘要(Digest),可以用Skopeo查询(不需要拉镜像):
skopeo inspect docker://org/foo:34f8a342 | jq -r '.Digest'
  1. 发送POST请求到Docker Hub的标签创建接口,把新标签指向刚才获取的摘要:
curl -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: Basic $(echo -n '用户名:密码' | base64)" \
  -d '{"tag": "latest", "digest": "sha256:xxxxxxxxx"}' \
  https://hub.docker.com/v2/repositories/org/foo/tags/

注意:这里的sha256:xxxxxxxxx就是第一步获取到的镜像摘要。

方法3:使用Docker Manifest命令(需开启实验功能)

Docker CLI的manifest命令也能实现这个操作,但需要先启用Docker的实验性功能:

  1. 在Docker配置文件~/.docker/config.json里添加"experimental": "enabled"来开启实验模式
  2. 创建新的manifest,把latest标签指向目标镜像:
docker manifest create org/foo:latest org/foo:34f8a342
  1. 推送这个manifest到Docker Hub:
docker manifest push org/foo:latest

一些注意事项

  • 不管用哪种方法,你操作的Docker Hub账号必须拥有该镜像仓库的推送权限,否则会被拒绝。
  • 这些操作都是原子性的,不会出现latest标签指向错误镜像的中间状态,不用担心生产环境的镜像切换问题。

内容的提问来源于stack exchange,提问作者Poma

火山引擎 最新活动