如何在不拉取镜像的情况下为Docker Hub添加标签别名
当然可以!完全不需要把镜像拉到本地就能在Docker Hub上给已有镜像添加标签别名,我给你分享几个靠谱的方法:
方法1:使用Skopeo工具(推荐)
Skopeo是专门为跨镜像仓库操作设计的工具,它可以直接在远程仓库之间复制镜像(本质上就是添加标签,因为Docker镜像的标签其实是指向镜像摘要的指针),全程不需要把镜像拉到本地。
步骤如下:
- 先安装Skopeo(大部分Linux发行版的包管理器里都有,比如Ubuntu用
apt install skopeo,CentOS用dnf install skopeo) - 执行复制命令,直接给远程镜像加新标签:
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也是个好办法:
- 首先获取目标镜像的摘要(Digest),可以用Skopeo查询(不需要拉镜像):
skopeo inspect docker://org/foo:34f8a342 | jq -r '.Digest'
- 发送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的实验性功能:
- 在Docker配置文件
~/.docker/config.json里添加"experimental": "enabled"来开启实验模式 - 创建新的manifest,把
latest标签指向目标镜像:
docker manifest create org/foo:latest org/foo:34f8a342
- 推送这个manifest到Docker Hub:
docker manifest push org/foo:latest
一些注意事项
- 不管用哪种方法,你操作的Docker Hub账号必须拥有该镜像仓库的推送权限,否则会被拒绝。
- 这些操作都是原子性的,不会出现
latest标签指向错误镜像的中间状态,不用担心生产环境的镜像切换问题。
内容的提问来源于stack exchange,提问作者Poma




