查看原文
其他

教你如何快捷的查询选择网络仓库镜像tag

西岐Docker君 Docker中文社区 2022-10-11

    我们从docker hub上默认情况下会拉取tag为latest的镜像,如果我们不想一页一页的翻看所有的tag,那么我们如何自由快捷的查询选择需要的tag呢? 少年,快上车, 我们一起盘它!


    我们本地启动一个容器的话,直接通过以下命令即可快速启动(以elasticsearch的镜像为例)。

docker run -it -p 9190:8080 \ -p 9191:8361 \ -v /app/mdtzjt/:/app/ \ --name mdtzjt \ elasticsearch/elasticsearch

    执行docker run命令最后一个参数是镜像名称,一般情况下镜像命名遵循Registry/Repository/Image:tag 规则,各部分含义如下


  • Registry:统一的Docker Registry地址。

  • Repository:镜像仓库,用来管理一类镜像。

  • Image:具体的镜像名称。

  • tag:具体的镜像标签。


    我们执行上面的命令的时候,就会到 docker hub 默认的Registry上去拉取Repository名为elasticsearch且Image名为elasticsearch的镜像,镜像可能会存在多个版本的tag,默认情况下会拉取tag为latest的镜像。这里Registry/Repository/Image 都比较好找,但是镜像存在哪些版本我们就比较难找了,是的,我们可以一页一页的翻看所有的tag,但是这样的话效率就比较低下。我在网络上找到一个比较快捷的方法,基本思路就是用docker官方提供的API接口对指定镜像进行查询,对接口数据进行处理后即可得到所有的tag,这样就大大提高了效率。下面我就和大家一起分享下,中间过程需要用到sed、awk等相关知识。 


一、代码如下(dockertags.sh):

#!/bin/bashfunction usage() {cat << HELP
dockertags -- list all tags for a Docker image on a remote registry.
EXAMPLE: - list all tags for ubuntu: dockertags ubuntu
- list all php tags containing apache: dockertags php apache
HELP}
if [ $# -lt 1 ]; then usage exitfi
image="$1"tags=`wget -q https://registry.hub.docker.com/v1/repositories/${image}/tags -O - | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n' | awk -F: '{print $3}'`
if [ -n "$2" ]; then tags=` echo "${tags}" | grep "$2" `fiecho "${tags}"


二、使用方法:


  1. dockertags ubuntu : 列出centos镜像的所有tag


dockertags php apache : 列出所有包含apache的php镜像的tag



三、实现思路分析


通过 $# -lt 1 判断shell的参数是否少于一个( $# 表示shell的参数个数),如果少于一个就执行usage函数,输出一些帮助信息并退出程序。如果大于等于一个参数则继续执行。


$1: 表示shell中第1个参数,dockertags ubuntu中$1就是ubuntu

wget -q https://registry.hub.docker.com/v1/repositories/${image}/tags -O -

:会将镜像名称拼接到查询的API接口中,形成https://registry.hub.docker.com/v1/repositories/ubuntu/tags,通过wget访问该接口得到查询结果,-q参数会关闭wget冗余的输出,-O -参数让wget访问的结果可以在命令行中呈现,如下:


接着通过sed来对得到json进行处理,sed -e表示执行脚本,后面可以跟多个-e参数,每部分的解释如下:


  • -e 's/[][]//g':表示将json结果中前后的中括号去掉

  • -e 's/"//g':表示将json结果中的双引号去掉

  • -e 's/ //g':表示将json中的空格去掉


sed处理后的结果如下:


sed处理完后,通过tr将json的右大括号替换成换行符,结果如下:


最后通过awk指定通过-F参数指定各个字段分隔符为:将每行数据分隔成三个部分, '{print $3}' 直接输出第三列结果即为我们需要的镜像的tag列表,如下:


此时tags变量中已经保存了所有与当前镜像相关的tag列表了,如果shell中的第二个参数不为空,就表示需要进一步的根据第二个参数进行过滤,比如 dockertags php apache ,此时 $2 就是apache,我们需要过滤出php镜像所有的tag中包含apache的tag,直接通过管道加上grep即可, echo "${tags}" | grep "$2" ,先做变量替换,在执行命令。最后输出所有满足条件的tag列表。


往期精彩

《Docker是什么?》

Kubernetes是什么?

《Kubernetes和Docker到底有啥关系?》

《Docker镜像进阶:了解其背后的技术原理》

《教你如何修改运行中的容器端口映射》

《Docker君带你认识Docker Swarm》

Docker 基础用法和命令帮助



免责声明:本文部分内容来源于网络,所载内容仅供参考。转载仅为学习和交流之目的,如无意中侵犯您的合法权益,请及时联系西岐Docker君!



dockerchina

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存