Docker檢視遠端倉庫的標籤工具

warjiang發表於2019-01-12

背景

最近入坑了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? 找到了一個算是比較好的答案,基本思路就是用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}"
複製程式碼

使用方式如下:

  1. dockertags ubuntu : 列出ubuntu映象的所有tag
    image
  2. dockertags php apache : 列出所有包含apache的php映象的tag
    image

實現分析

通過$# -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訪問的結果可以在命令列中呈現,如下:

image
接著通過sed來對得到json進行處理,sed -e 表示執行指令碼,後面可以跟多個-e引數,每部分的解釋如下:

  • -e 's/[][]//g':表示將json結果中前後的中括號去掉
  • -e 's/"//g':表示將json結果中的雙引號去掉
  • -e 's/ //g':表示將json中的空格去掉

sed處理後的結果如下:

Docker檢視遠端倉庫的標籤工具

sed處理完後,通過tr將json的右大括號替換成換行符,結果如下:

image

最後通過awk指定通過-F引數指定各個欄位分隔符為:將每行資料分隔成三個部分:

image
'{print $3}'直接輸出第三列結果即為我們需要的映象的tag列表,如下:
image

此時tags變數中已經儲存了所有與當前映象相關的tag列表了,

如果shell中的第二個引數不為空,就表示需要進一步的根據第二個引數進行過濾,比如dockertags php apache,此時$2就是apache,我們需要過濾出php映象所有的tag中包含apache的tag,直接通過管道加上grep即可,echo "${tags}" | grep "$2",先做變數替換,在執行命令。最後輸出所有滿足條件的tag列表。

相關文章