在Docker Hub上显示图像标签的列表
引言
关于所述主题,虽然在许多文章中已经提及,但我已经使得可以指定一些选项,并且可以在Docker主机上像使用docker命令那样轻松使用,以下是我的备忘录。
说实话,我希望能够包含在官方的docker命令中…
必须的东西 de
如果以下的软件没有安装在Docker主机操作系统上,请根据需要使用yum、apt、homebrew等安装。
-
- curl(普通は入っている)
- jq
※此执行脚本是基于CentOS7.6(bash)的。
在您的Docker for Mac家用电脑上也可以进行操作确认。
虽然我认为它也适用于其他操作系统,但我尚未尝试用CoreOS等系统,如果有建议,我可以考虑修改…
使用方法
Is there anything else that you would like me to do for you?
请将存放在GitHub上的脚本放置在PATH所指定的位置或者创建别名,在适当的执行环境中进行操作。
另外,在解析响应的JSON过程中,会在/tmp目录下创建临时目录和文件,所以需要/tmp目录的写权限。
* “/tmp”可以通过环境变量${TMPDIR}进行更改。
简单执行
为了使结果能够用作docker pull命令的参数,我们已将其以”{镜像名称}:{标签名称}”的格式输出。
[docker@docker-host ~]$ docker-tags centos
centos:latest
centos:centos7.6.1810
centos:centos7.5.1804
centos:centos7.4.1708
centos:centos7.3.1611
centos:centos7.2.1511
centos:centos7.1.1503
centos:centos7.0.1406
centos:centos7
centos:centos6.9
centos:centos6.8
centos:centos6.7
centos:centos6.6
centos:centos6.10
centos:centos6
centos:centos5.11
centos:centos5
centos:7.6.1810
centos:7.5.1804
centos:7.4.1708
centos:7.3.1611
centos:7.2.1511
centos:7.1.1503
centos:7.0.1406
centos:7
centos:6.9
centos:6.8
centos:6.7
centos:6.6
centos:6.10
centos:6
centos:5.11
centos:5
[docker@docker-host ~]$
详细(以表格形式输出)
詳細表示版已配置为以表格形式(tsv)输出,并附上大小和最后更新时间。
[docker@docker-host ~]$ docker-tags --detail --reverse --output-file ${HOME}/result.tsv centos
[docker@docker-host ~]$ cat ${HOME}/result.tsv
tag size last_updated
5 87342331 2017-04-06T20:16:25.879532Z
5.11 87094724 2017-04-06T20:17:31.013272Z
6 69835815 2019-05-11T01:12:16.895622Z
6.10 69800401 2019-05-11T01:12:19.263911Z
6.6 73689716 2019-05-11T01:12:22.647196Z
6.7 67814264 2019-05-11T01:12:25.385696Z
6.8 70226281 2019-05-11T01:12:27.462311Z
6.9 70181649 2019-05-11T01:12:31.078690Z
7 75403831 2019-05-11T01:12:34.106340Z
7.0.1406 76789367 2019-05-11T01:12:38.015816Z
7.1.1503 77375353 2019-05-11T01:12:40.019129Z
7.2.1511 71553381 2019-05-11T01:12:43.286737Z
7.3.1611 72170894 2019-05-11T01:12:45.185299Z
7.4.1708 73358335 2019-05-11T01:12:49.971649Z
7.5.1804 74692733 2019-05-11T01:12:52.848602Z
7.6.1810 75161332 2019-05-11T01:12:56.206570Z
centos5 87342331 2017-04-06T20:16:24.015937Z
centos5.11 87094724 2017-04-06T20:17:29.333542Z
centos6 69835815 2019-05-11T01:12:57.598615Z
centos6.10 69800401 2019-05-11T01:13:00.432911Z
centos6.6 73689716 2019-05-11T01:13:03.407549Z
centos6.7 67814264 2019-05-11T01:13:06.308806Z
centos6.8 70226281 2019-05-11T01:13:08.989816Z
centos6.9 70181649 2019-05-11T01:13:10.722926Z
centos7 75403831 2019-05-11T01:13:15.423566Z
centos7.0.1406 76789367 2019-05-11T01:13:18.660373Z
centos7.1.1503 77375353 2019-05-11T01:13:22.710971Z
centos7.2.1511 71553381 2019-05-11T01:13:26.586999Z
centos7.3.1611 72170894 2019-05-11T01:13:27.403263Z
centos7.4.1708 73358335 2019-05-11T01:13:29.557664Z
centos7.5.1804 74692733 2019-05-11T01:13:34.033772Z
centos7.6.1810 75161332 2019-05-11T01:13:36.617627Z
latest 75403831 2019-05-11T01:13:40.692601Z
[docker@docker-host ~]$
执行选项列表
-o or –output-file
デフォルトでは標準出力に結果を出力しますが、このオプションを指定するとオプションで指定したファイルに出力します。(結果のみ)
-r or –reverse
デフォルトではタグ名の降順に出力しますが、このオプションを指定するとタグ名の昇順になります。
-d or –detail
デフォルトでは{イメージ名}:{タグ名}の形式で出力しますが、このオプションを付けると、タグの名前、イメージサイズ、最終更新日時をtsv形式で出力します。
-v or –verbose
APIの処理性能上、タグ数が多い場合、待たされることがあるので、curlコマンドの処理経過などを表示するためのオプションです。
-h or –help
コマンドの実行方法(Usage)を表示します。
备忘录:脚本处理概述
请参考GitHub以获取完整的图像。
从DockerHub的API获取标签列表。
您可以通过向以下URL发送GET请求来获取标签列表,返回的数据将以JSON格式呈现。您无需进行特殊认证或添加特殊标头。
https://registry.hub.docker.com/v2/repositories/{USER}/{IMAGE}/tags/
如果是公式图像的情况,将以图书馆的形式处理作为相对应的用户名称的部分,并进行以下处理。
TARGET_URL="https://registry.hub.docker.com/v2/repositories"
if [[ ! "${IMAGE}" =~ ^.+/.+$ ]]; then
# For official images.
TARGET_URL="${TARGET_URL}/library"
fi
TARGET_URL="${TARGET_URL}/${IMAGE}/tags/"
如果不是公式图像,请直接指定参数本身,例如”gitbucket/gitbucket”。
DockerHub标签列表的API响应。
回应的格式如下所示。虽然我没有详细调查,但大致来说,
-
- count:全体タグの件数
-
- next:次のページのエンドポイントURL(クエリパラメータで?page={ページ番号}が付いただけ
-
- previous:2ページ目以降の場合の前のページのURL
-
- results:タグ情報リスト
name: タグの名前
full_size:当該タグ全体のイメージ
images:ツリー構造になっている子イメージ?とかのことだと思われます。(docker iamges -aで表示されるやつ?)
last_updated:とうがいタグの最終更新日時(nullのケースもありました)
对于其他的内容,因为本次不会使用,所以可以忽略掉…
{
"count": 33,
"next": "https://registry.hub.docker.com/v2/repositories/library/centos/tags/?page=2",
"previous": null,
"results": [
{
"name": "latest",
"full_size": 75403831,
"images": [
{
"size": 75403831,
"architecture": "amd64",
"variant": null,
"features": null,
"os": "linux",
"os_version": null,
"os_features": null
},
{
"size": 76787221,
"architecture": "ppc64le",
"variant": null,
"features": null,
"os": "linux",
"os_version": null,
"os_features": null
},
{
"size": 75654099,
"architecture": "386",
"variant": null,
"features": null,
"os": "linux",
"os_version": null,
"os_features": null
},
{
"size": 74163767,
"architecture": "arm64",
"variant": "v8",
"features": null,
"os": "linux",
"os_version": null,
"os_features": null
},
{
"size": 70029389,
"architecture": "arm",
"variant": "v7",
"features": null,
"os": "linux",
"os_version": null,
"os_features": null
}
],
"id": 2107,
"repository": 54,
"creator": 7,
"last_updater": 1156886,
"last_updated": "2019-05-11T01:13:40.692601Z",
"image_id": null,
"v2": true
},
{
"name": "centos7.6.1810",
"full_size": 75161332,
"images": [
{
"size": 75161332,
"architecture": "amd64",
"variant": null,
"features": null,
"os": "linux",
"os_version": null,
"os_features": null
},
{
"size": 76454310,
"architecture": "ppc64le",
"variant": null,
"features": null,
"os": "linux",
"os_version": null,
"os_features": null
}
],
"id": 41612723,
"repository": 54,
"creator": 1156886,
"last_updater": 1156886,
"last_updated": "2019-05-11T01:13:36.617627Z",
"image_id": null,
"v2": true
},
・・・省略・・・
]
}
获取第二页及之后的内容
由于在一次请求中无法获取所有条目,因此我们会循环遍历直到响应 JSON 的 next 字段为”null”为止。
# 先頭ページのURL定義
TARGET_URL="https://registry.hub.docker.com/v2/repositories"
if [[ ! "${IMAGE}" =~ ^.+/.+$ ]]; then
# For official images.
TARGET_URL="${TARGET_URL}/library"
fi
TARGET_URL="${TARGET_URL}/${IMAGE}/tags/"
PAGE_NO=1
# 次ページ(next)がnullになるまでループ。
while [ "${TARGET_URL}" != "null" ]; do
RESPONSE_BODY_FILE=${TMP_FILE_DIR}/RESBODY_PAGE_${PAGE_NO}.json
# Calling docker hub api.
if "${IS_VERBOSE}"; then
echo "Getting tag list from docker hub at page ${PAGE_NO}..."
fi
# ここでcurlコマンドでAPIから情報を取得します。
call_api ${TARGET_URL} ${RESPONSE_BODY_FILE}
# ここでjqコマンドでresults(タグ情報一覧)が取得できるかパースします。
JSON_FILE=${TMP_FILE_DIR}/RESULT_PAGE_${PAGE_NO}.json
jq -c '.results' ${RESPONSE_BODY_FILE} > ${JSON_FILE} 2>&1
STATUS=$?
if [ ${STATUS} -ne 0 ]; then
output_error "Failure parse response."
cat ${RESPONSE_BODY_FILE}
echo ""
_claen
exit ${STATUS}
fi
# レスポンスのresultsを全体処理結果ファイルにマージします。
if [ -f "${RESULT_JSON_FILE}" ]; then
# 2回目以降はjqコマンドでマージします。
mv -f "${RESULT_JSON_FILE}" "${RESULT_JSON_FILE}_org"
jq -s add "${RESULT_JSON_FILE}_org" "${JSON_FILE}" > "${RESULT_JSON_FILE}"
else
# 初回はリネームのみ。
mv ${JSON_FILE} ${RESULT_JSON_FILE}
fi
# レスポンスボディの`next`要素を取得します。
TARGET_URL=$(jq -r .next ${RESPONSE_BODY_FILE})
STATUS=$?
if [ ${STATUS} -ne 0 -o -z "${TARGET_URL}" ]; then
output_error "Failure getting next page url."
cat ${RESPONSE_BODY_FILE}
_claen
exit ${STATUS}
fi
PAGE_NO=$(echo ${TARGET_URL} | sed -e 's/^\(http.\+\)\(\?\)\(\page=\)\([[:digit:]]\+\)$/\4/')
# GNU系だと上の正規表現ではダメみたいなので以下に差し替えてください。
# PAGE_NO=$(echo ${TARGET_URL} | sed -E -e 's|^https?://.+\?page=([[:digit:]]+)$|\1|')
done
将json数据进行格式化输出
使用jq命令对通过上述处理合并完成的results(标签信息列表)进行格式化。以下将通过两种方式进行解释,具体细节请查看脚本本体。
如果选择简明显示的情况下
将以下内容以中国传统的方式进行改写,只需要一个选项:
jq -r ‘sort_by(.name) | reverse | map_values(\”${IMAGE}:\”+.name) | .[]
将jq -r ‘sort_by(.name) | reverse | map_values(“\”${IMAGE}:\”+.name) | .[]’进行翻译成中文的一个方式是:
jq -r ‘按照.name进行排序 | 反转 | 将值映射为(“\”${IMAGE}:\”+.name) | .[]’
-
- results[].nameでソートします。
-
- 降順の方がうれしいのでオプション指定がない場合は降順になるようにreverseを指定。
-
- タグ一覧を表示してどうしたいかというとdocker pullしたいことがおおいはずなので、docker pull ${image}:${tag}にコピペしやすいようにmap_valuesで”イメージ名:タグ名”となるように整形しています。
- 最後の.[]はテキスト出力用。
另外, -r选项旨在去除文本中的双引号等。
如果有诸如”–detail”这样的详细显示选项的话
jq -r ‘sort_by(.name) | reverse | map({tag: .name, size: .full_size, last_updated: .last_updated}) | .[] | [.tag, .size, .last_updated] | @tsv
将上述命令原生地转换成中文,只提供一种选择:
jq -r ‘按照.name排序 | 反转 | 转换为数组形式({tag: .name, size: .full_size, last_updated: .last_updated}) | 提取每个元素 | 提取数组的[tag, size, last_updated] | 使用制表符分隔输出’
-
- results[].nameでソートします。
-
- 降順の方がうれしいのでオプション指定がない場合は降順になるようにreverseを指定。(ここまではシンプル版と同じ)
-
- table変換する前に必要な要素のみを抜粋したオブジェクト配列型にmapで変換します。
- タグの名前をname⇒tag,full_size⇒sizeに変換していますが、特に深い意味はありません。(こんなこともできるようという記録だと思ってください)
[
{
"name: "xxxx",
"full_size": 99999,
"last_updated": "2019-05-11T01:13:36.617627Z",
・・・その他要素は割愛・・・
},
・・・要素数分続く・・・
]
[
{
"tag: "xxxx",
"size": 99999,
"last_updated": "2019-05-11T01:13:36.617627Z"
},
・・・要素数分続く・・・
]
.[]は変換した↑のものから配列として取り出す。(既に配列じゃないかという突っ込みがあると思いますが、jqコマンドの内部的には違う)
[.tag, .size, .last_updated]は後続の”@tsv”に渡すテーブルの列要素の一覧になります。
最後の@tsvでtsv形式にしてくれます。jqコマンドは他にも@csv, @text, @htmlなどの対応もありますが、csvかtsv以外はあまり有用な用途はわかりませんでした。