🐈

dockerhubのタグを良い感じの並び順で取得する

2021/08/11に公開

何がしたいのか?

  • dockerhubのイメージから最新のバージョンのタグを取得したかった。

2019/09/07 更新 sort -V で簡単。

`curl https://registry.hub.docker.com/v1/repositories/misskey/misskey/tags \
 | jq -r '.[].name' \
 | sort -V
 | tail -n 2 | head -n 1

で終わり。

sort -V はバージョン番号のソートの指定で、前ゼロ等の処理をよしなにやってくれるというもの(man によると)

v11.4.1 のようなプレフィックスがあっても大丈夫という優れもの。

いつきさんご指摘ありがとうございました。

以下、古い記事を供養の為にそのまま残しておきます。

tl;dr;

`curl https://registry.hub.docker.com/v1/repositories/misskey/misskey/tags \
 | jq -r '.[].name' \
 | sed -e "s/\([0-9]*\)\.\([0-9]\)\.\(.*\)/\1.0\2.\3/g" | sort \
 | sed -e "s/\([0-9]*\)\.0\([0-9]\)\.\(.*\)/\1.\2.\3/g"
 | tail -n 2 | head -n 1

解説

curl

dockerhub の API でタグ一覧を取得する。

返り値はこんな感じ。

`[{"layer": "", "name": "11.28.0"}, {"layer": "", "name": "11.28.1"}, {"layer": "", "name": "11.28.2"}, {"layer": "", "name": "11.29.0"}, {"layer": "", "name": "11.3.0"}, {"layer": "", "name": "11.3.1"}, {"layer": "", "name": "11.30.0"}, {"layer": "", "name": "11.31.0"}, {"layer": "", "name": "11.31.1"}, {"layer": "", "name": "11.31.2"}, {"layer": "", "name": "11.31.3"}, {"layer": "", "name": "11.31.4"}, {"layer": "", "name": "11.4.0"}, {"layer": "", "name": "11.5.0"}, {"layer": "", "name": "11.5.1"}, {"layer": "", "name": "11.6.0"}, {"layer": "", "name": "11.7.0"}, {"layer": "", "name": "11.8.0-2"}, {"layer": "", "name": "11.8.1"}, {"layer": "", "name": "11.9.0"}]

jq

json の配列内から name だけを抜き出す。

dockerhub の API はタグ名を文字列としてソートしてくれているのか、以下のような出力が得られる。

-r を付けることで、ダブルクオートで囲まれていない出力が得られる。

`11.31.2
11.31.3
11.31.4
11.4.0
11.5.0
11.5.1

11.31.4 > 11.4.0 なのでこの並び順は都合が悪いので、どうにかしていく。

sed その 1

11.4.0 のような中央が一桁の場合、0 を補って二桁にする。

11.4.0 => 11.04.0

sort

文字列順ソートで良いのでそのまま並び替え

sed その 2

変更したままだと存在しないタグになってしまうので(当然)元に戻す。

"11.04.0" => "11.4.0"

tail & head

`11.31.3
11.31.4
latest

最新のタグの取得。

latest なら常に最新!だと最初からこの記事は不要になってしまうので、

ちゃんと最新のタグを取得します。

tail -n 2 で末尾二行を取得して、

`11.31.4
latest

head -n 1 でその先頭行を取得します。

`11.31.4

蛇足

わかっているがスルーした点

  • メジャーバージョン一桁のコンテナはないのでバージョンの最初の桁の二桁化はしていない
  • 三桁目が二桁になったら同じ事が起きるが対応してない
  • 10.100.0 というバージョンが見えるが見なかった事にしている

蛇足

エスケープだらけでみづらい。 まさかグループ化の ( がエスケープ必要だとは思わなかった。

正規表現に関しては、 <a href="https://www.debuggex.com/">https://www.debuggex.com/ が大変わかりやすかったです。

Discussion