最近入坑了docker,好比本地想要启动一个elastic容器的话,直接经过如下命令便可快速启动一个elasticsearch的实例。php
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
规则,各部分含义以下docker
当咱们执行上面的命令的时候,实际上会到默认的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? 找到了一个算是比较好的答案,基本思路就是用docker官方提供的API接口对指定镜像进行查询,对接口数据进行处理后便可获得全部的tag,笔者以为写的比较有意思,就拿来分析一下,中间过程须要用到sed、awk等相关知识。 dockertags.sh代码以下:shell
#!/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函数,输出一些帮助信息并退出程序。若是大于等于一个参数则继续执行。apache
$1
: 表示shell中第1个参数,dockertags ubuntu
中$1就是ubuntujson
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访问的结果能够在命令行中呈现,以下: ubuntu
-e 's/[][]//g'
:表示将json结果中先后的中括号去掉-e 's/"//g'
:表示将json结果中的双引号去掉-e 's/ //g'
:表示将json中的空格去掉sed处理后的结果以下: bash
sed处理完后,经过tr将json的右大括号替换成换行符,结果以下: elasticsearch
最后经过awk指定经过-F参数指定各个字段分隔符为:
将每行数据分隔成三个部分: 函数
'{print $3}'
直接输出第三列结果即为咱们须要的镜像的tag列表,以下:
此时tags变量中已经保存了全部与当前镜像相关的tag列表了,ui
若是shell中的第二个参数不为空,就表示须要进一步的根据第二个参数进行过滤,好比dockertags php apache
,此时$2
就是apache,咱们须要过滤出php镜像全部的tag中包含apache的tag,直接经过管道加上grep便可,echo "${tags}" | grep "$2"
,先作变量替换,在执行命令。最后输出全部知足条件的tag列表。