🐈
dockerhubのタグを良い感じの並び順で取得する
何がしたいのか?
- 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