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? 找到了一個算是比較好的答案,基本思路就是用docker官方提供的API接口對指定鏡像進行查詢,對接口數據進行處理后即可得到所有的tag,筆者覺得寫的比較有意思,就拿來分析一下,中間過程需要用到sed、awk等相關知識。 dockertags.sh代碼如下:
function usage() { cat << HELPdockertags -- 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 apacheHELP }if [ $# -lt 1 ]; thenusageexit fiimage="$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" ]; thentags=` echo "${tags}" | grep "$2" ` fi echo "${tags}" 復制代碼使用方式如下:
實現分析
通過$# -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查看远端仓库的标签工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET AJAX(开发代号:At
- 下一篇: 在应用程序中加入.net脚本