如何批量为带私有仓库前缀的Docker镜像添加无前缀标签
批量为Docker镜像添加不带私有仓库前缀的标签
当前Docker镜像列表
执行docker images得到以下输出:
REPOSITORY TAG IMAGE ID CREATED SIZE my.website.com/image-back prod 0970fe98b4fb 22 minutes ago 782MB my.website.com/image-api prod dbce64b7b0e8 22 minutes ago 719MB my.website.com/postgres 15.1-alpine f8428074961e 8 months ago 243MB nginx alpine 433dbc17191a 2 weeks ago 42.6MB hello-world latest 9c7a54a9a43c 4 months ago 13.3kB
需求说明
仅对REPOSITORY列以my.website.com/开头的镜像执行docker tag命令,为这些镜像添加不带私有仓库域名前缀的新标签(原标签保留),方便后续修改项目中的Dockerfile。
预期执行后的docker images输出:
REPOSITORY TAG IMAGE ID CREATED SIZE image-back prod 0970fe98b4fb 28 minutes ago 782MB my.website.com/image-back prod 0970fe98b4fb 28 minutes ago 782MB image-api prod dbce64b7b0e8 28 minutes ago 719MB my.website.com/image-api prod dbce64b7b0e8 28 minutes ago 719MB postgres 15.1-alpine f8428074961e 8 months ago 243MB my.website.com/postgres 15.1-alpine f8428074961e 8 months ago 243MB nginx alpine 433dbc17191a 2 weeks ago 42.6MB hello-world latest 9c7a54a9a43c 4 months ago 13.3kB
尝试的错误命令
以下命令执行失败:
docker tag $(docker images -a | awk 'FNR>=2 {print $1":"$2}') $(docker images -a | awk 'FNR>=2 {print $1":"$2}' | sed -E 's/(my.website.com\/)//g')
问题在于该命令会把所有镜像的源标签和新标签一次性传入docker tag,参数顺序混乱,且会处理不需要修改的镜像,导致执行错误。
正确解决方案
方案1:循环处理(可读性高)
docker images --format '{{.Repository}}:{{.Tag}}' | grep '^my.website.com/' | while read img; do new_tag=$(echo "$img" | sed 's/^my.website.com\///') docker tag "$img" "$new_tag" done
方案2:awk单命令处理(简洁)
docker images --format '{{.Repository}}:{{.Tag}}' | awk '/^my.website.com\// { new_tag = substr($0, length("my.website.com/")+1); system("docker tag " $0 " " new_tag) }'
命令说明
docker images --format '{{.Repository}}:{{.Tag}}':用官方格式化输出只获取仓库名+标签的组合,避免解析表格时的列对齐问题,更可靠。grep '^my.website.com/':精准过滤出需要处理的私有仓库镜像。- 两种方案都会为每个符合条件的镜像生成不带前缀的新标签,并执行
docker tag添加标签,原标签会被保留。
执行完上述命令后,再次运行docker images即可看到预期的镜像列表。
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

