Docker查看遠端倉庫的標籤工具

背景

最近入坑了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 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代碼以下: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}"
複製代碼

使用方式以下:

  1. dockertags ubuntu : 列出ubuntu鏡像的全部tag
    image
  2. dockertags php apache : 列出全部包含apache的php鏡像的tag
    image

實現分析

經過$# -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

image
接着經過sed來對獲得json進行處理,sed -e 表示執行腳本,後面能夠跟多個-e參數,每部分的解釋以下:

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

sed處理後的結果以下: bash

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

image

最後經過awk指定經過-F參數指定各個字段分隔符爲:將每行數據分隔成三個部分: 函數

image
'{print $3}'直接輸出第三列結果即爲咱們須要的鏡像的tag列表,以下:
image

此時tags變量中已經保存了全部與當前鏡像相關的tag列表了,ui

若是shell中的第二個參數不爲空,就表示須要進一步的根據第二個參數進行過濾,好比dockertags php apache,此時$2就是apache,咱們須要過濾出php鏡像全部的tag中包含apache的tag,直接經過管道加上grep便可,echo "${tags}" | grep "$2",先作變量替換,在執行命令。最後輸出全部知足條件的tag列表。

相關文章
相關標籤/搜索