Help us understand the problem. What is going on with this article?

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 というバージョンが見えるが見なかった事にしている

蛇足

エスケープだらけでみづらい。 まさかグループ化の ( がエスケープ必要だとは思わなかった。
正規表現に関しては、 https://www.debuggex.com/ が大変わかりやすかったです。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away