乐趣区

Docker查看远端仓库的标签工具

背景
最近入坑了 docker,比如本地想要启动一个 elastic 容器的话,直接通过以下命令即可快速启动一个 elasticsearch 的实例。
docker run -d -p 9200:9200 \
-p 9300:9300 \
–name elasticsearch001 -h elasticsearch001 \
-e cluster.name=lookout-es \
-e ES_JAVA_OPTS=”-Xms512m -Xmx512m” \
-e xpack.security.enabled=false \
elasticsearch/elasticsearch
执行 docker run 命令最后一个参数是镜像名称,一般来说镜像命名遵循 Registry/Repository/Image:tag 规则,各部分含义如下

Registry:公司统一的 Docker Registry 地址。
Repository:镜像仓库,用来管理一类镜像。
Image:具体某镜像的名称。
tag:具体某镜像的标签。

当我们执行上面的命令的时候,实际上会到默认的 Registry(docker hub) 上去拉取 Repository 名为 elasticsearch 且 Image 名为 elasticsearch 的镜像,镜像可能会存在多个版本的 tag,默认情况下会拉取 tag 为 latest 的镜像。这里 Registry/Repository/Image 的问题不大,都比较好找,但是一般情况下镜像存在哪些版本用户比较难找,之前笔者就是通过到 dockerhub 上,一页一页的翻看所有的 tag,这种情况效率比较低。后来笔者在 [How to list all tags for a Docker image on a remote registry?](https://stackoverflow.com/que…,基本思路就是用 docker 官方提供的 API 接口对指定镜像进行查询,对接口数据进行处理后即可得到所有的 tag, 笔者觉得写的比较有意思,就拿来分析一下,中间过程需要用到 sed、awk 等相关知识。dockertags.sh 代码如下:
#!/bin/bash
function 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
exit
fi

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” `
fi
echo “${tags}”
使用方式如下:

dockertags ubuntu:列出 ubuntu 镜像的所有 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.c…,通过 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 列表。

退出移动版