JP7FKFの備忘録

ヒトは,忘れる生き物だから.

CLIでサクっとimage名を指定してdocker tagの一覧を取得する話

dockerを使っているとpullするときにdocker tagを取得したくなることがよくある.どのversionのimageがdocker hubにあがっているのかをみてそれをversion指定してpullしたくなる時とか.

今回はimage名を指定してdocker tagの一覧を取得するようなzsh functionをつくってzshrcに記述し,CLI command的に利用できるようにしてみたので紹介する.なおこの内容はほぼ下記の内容を踏襲させてもらって,一部工夫をいれたものである.

su-kun1899.hatenablog.com

早速だが,モノは下記の通り.これを ~/.zshrc とかに書いておく.書いたあとに適当にshellを再起動するか, source ~/.zshrc とかをして読み込めば使えるようになる.

function docker-taglist (){
  local image=${1}
  local limit=${2:=1}

  # official image exists under /library path
  if [[ ! "${image}" =~ ^.+/.+$ ]]; then
    image="library/${image}"
  fi
  local next="https://registry.hub.docker.com/v2/repositories/${image}/tags"
  local names
  while [[ ${limit} -gt 0 && ${next} != "null" ]]
  do
    response=$(curl --silent --show-error "${next}")
    names="${names}\n$(echo ${response} | jq -r ".results|map_values(\"${image}:\"+.name)|.[]")"
    next=$(echo ${response} | jq -r .next)
    limit=$((${limit}-1))
  done
  echo -e "${names}"
}

やっていることは見ての通り簡単なもので,https://registry.hub.docker.com/v2/repositories/${image}/tagsを叩いて帰ってくるjson dataからほしいデータをjqで抜いて適当にくっつけているだけである.たとえばmysqlをimageを指定してを叩くと

% curl https://registry.hub.docker.com/v2/repositories/library/mysql/tags
{"count":119,"next":"https://registry.hub.docker.com/v2/repositories/library/mysql/tags?page=2","previous":null,"results":[{"creator":7,"id":20021,"image_id":null,"images":[{"architecture":"amd64","features":"","variant":null,"digest":"sha256:bbeff35b63bf28aeb024de309aab2d501f8aa30e94664d3840d55b36c8db53c8","os":"linux","os_features":"","os_version":null,"size":161997667,"status":"active","last_pulled":"2021-05-06T04:22:19.161759Z","last_pushed":"2021-04-19T19:14:41.194888Z"}],"last_updated":"2021-04-19T19:14:50.332131Z","last_updater":1156886,"last_updater_username":"doijanky","name":"latest","repository":21179,"full_size":161997667,"v2":true,"tag_status":"active","tag_last_pulled":"2021-05-06T04:22:19.161759Z","tag_last_pushed":"2021-04-19T19:14:50.332131Z"},{"creator":1156886,"id":146193135,"image_id":null,"images":[{"architecture":"amd64","features":"","variant":null,"digest":"sha256:bbeff35b63bf28aeb024de309aab2d501f8aa30e94664d3840d55b36c8db53c8","os":"linux","os_features":"","os_version":null,"size":161997667,"status":"active","last_pulled":"2021-05-06T04:22:19.161759Z","last_pushed":"2021-04-19T19:14:41.194888Z"}],"last_updated":"2021-04-19T19:14:47.441552Z","last_updater":1156886,"last_updater_username":"doijanky","name":"8.0.24","repository":21179,"full_size":161997667,"v2":true,"tag_status":"active","tag_last_pulled":"2021-05-06T04:22:19.161759Z","tag_last_pushed":"2021-04-19T19:14:47.441552Z"},{"creator":621950,"id":5471601,"image_id":null,"images":[{"architecture":"amd64","features":"","variant":null,"digest":"sha256:bbeff35b63bf28aeb024de309aab2d501f8aa30e94664d3840d55b36c8db53c8","os":"linux","os_features":"","os_version":null,"size":161997667,"status":"active","last_pulled":"2021-05-06T04:22:19.161759Z","last_pushed":"2021-04-19T19:14:41.194888Z"}],"last_updated":"2021-04-19T19:14:44.794422Z","last_updater":1156886,"last_updater_username":"doijanky","name":"8.0","repository":21179,"full_size":161997667,"v2":true,"tag_status":"active","tag_last_pulled":"2021-05-06T04:22:19.161759Z","tag_last_pushed":"2021-04-19T19:14:44.794422Z"},{"creator":621950,"id":5472027,"image_id":null,"images":[{"architecture":"amd64","features":"","variant":null,"digest":"sha256:bbeff35b63bf28aeb024de309aab2d501f8aa30e94664d3840d55b36c8db53c8","os":"linux","os_features":"","os_version":null,"size":161997667,"status":"active","last_pulled":"2021-05-06T04:22:19.161759Z","last_pushed":"2021-04-19T19:14:41.194888Z"}],"last_updated":"2021-04-19T19:14:42.993272Z","last_updater":1156886,"last_updater_username":"doijanky","name":"8","repository":21179,"full_size":161997667,"v2":true,"tag_status":"active","tag_last_pulled":"2021-05-06T04:22:19.161759Z","tag_last_pushed":"2021-04-19T19:14:42.993272Z"},{"creator":1156886,"id":146193124,"image_id":null,"images":[{"architecture":"amd64","features":"","variant":null,"digest":"sha256:9f768489d306402ea11243f1b96aeaa4696adb9ed7c1bb0318724759b9cbd1a6","os":"linux","os_features":"","os_version":null,"size":154430588,"status":"active","last_pulled":"2021-05-06T04:23:02.792412Z","last_pushed":"2021-04-19T19:14:07.955061Z"}],"last_updated":"2021-04-19T19:14:31.26934Z","last_updater":1156886,"last_updater_username":"doijanky","name":"5.7.34","repository":21179,"full_size":154430588,"v2":true,"tag_status":"active","tag_last_pulled":"2021-05-06T04:23:02.792412Z","tag_last_pushed":"2021-04-19T19:14:31.26934Z"},{"creator":7,"id":20000,"image_id":null,"images":[{"architecture":"amd64","features":"","variant":null,"digest":"sha256:9f768489d306402ea11243f1b96aeaa4696adb9ed7c1bb0318724759b9cbd1a6","os":"linux","os_features":"","os_version":null,"size":154430588,"status":"active","last_pulled":"2021-05-06T04:23:02.792412Z","last_pushed":"2021-04-19T19:14:07.955061Z"}],"last_updated":"2021-04-19T19:14:26.36101Z","last_updater":1156886,"last_updater_username":"doijanky","name":"5.7","repository":21179,"full_size":154430588,"v2":true,"tag_status":"active","tag_last_pulled":"2021-05-06T04:23:02.792412Z","tag_last_pushed":"2021-04-19T19:14:26.36101Z"},{"creator":1156886,"id":133913292,"image_id":null,"images":[{"architecture":"amd64","features":"","variant":null,"digest":"sha256:4d3ef8034652ee13d7db73eafeb783440a2f10f2dd54e4f8808718b0748cc053","os":"linux","os_features":"","os_version":null,"size":102980915,"status":"active","last_pulled":"2021-05-06T04:35:45.82737Z","last_pushed":"2021-04-19T19:14:17.44793Z"}],"last_updated":"2021-04-19T19:14:22.28644Z","last_updater":1156886,"last_updater_username":"doijanky","name":"5.6.51","repository":21179,"full_size":102980915,"v2":true,"tag_status":"active","tag_last_pulled":"2021-05-06T04:35:45.82737Z","tag_last_pushed":"2021-04-19T19:14:22.28644Z"},{"creator":7,"id":19961,"image_id":null,"images":[{"architecture":"amd64","features":"","variant":null,"digest":"sha256:4d3ef8034652ee13d7db73eafeb783440a2f10f2dd54e4f8808718b0748cc053","os":"linux","os_features":"","os_version":null,"size":102980915,"status":"active","last_pulled":"2021-05-06T04:35:45.82737Z","last_pushed":"2021-04-19T19:14:17.44793Z"}],"last_updated":"2021-04-19T19:14:17.836259Z","last_updater":1156886,"last_updater_username":"doijanky","name":"5.6","repository":21179,"full_size":102980915,"v2":true,"tag_status":"active","tag_last_pulled":"2021-05-06T04:35:45.82737Z","tag_last_pushed":"2021-04-19T19:14:17.836259Z"},{"creator":7,"id":19969,"image_id":null,"images":[{"architecture":"amd64","features":"","variant":null,"digest":"sha256:9f768489d306402ea11243f1b96aeaa4696adb9ed7c1bb0318724759b9cbd1a6","os":"linux","os_features":"","os_version":null,"size":154430588,"status":"active","last_pulled":"2021-05-06T04:23:02.792412Z","last_pushed":"2021-04-19T19:14:07.955061Z"}],"last_updated":"2021-04-19T19:14:10.182408Z","last_updater":1156886,"last_updater_username":"doijanky","name":"5","repository":21179,"full_size":154430588,"v2":true,"tag_status":"active","tag_last_pulled":"2021-05-06T04:23:02.792412Z","tag_last_pushed":"2021-04-19T19:14:10.182408Z"},{"creator":1156886,"id":133747539,"image_id":null,"images":[{"architecture":"amd64","features":"","variant":null,"digest":"sha256:355617769102e9d2ebb7d5879263a12d230badb7271c91748b2c7b0ac6971083","os":"linux","os_features":"","os_version":null,"size":159323709,"status":"active","last_pulled":"2021-05-06T04:53:14.908711Z","last_pushed":"2021-04-10T07:42:48.565852Z"}],"last_updated":"2021-04-10T07:42:55.155529Z","last_updater":1156886,"last_updater_username":"doijanky","name":"8.0.23","repository":21179,"full_size":159323709,"v2":true,"tag_status":"active","tag_last_pulled":"2021-05-06T04:53:14.908711Z","tag_last_pushed":"2021-04-10T07:42:55.155529Z"}]}

このような応答が帰ってくる.このうちそれぞれのエントリについてのtag name情報をjqで抜いている.抜いたtag nameを適当にimage名とコロンでくっつけて,コピペしてdocker pullにそのまま入れれるように加工してある.

実際に使ってみるとこのような感じ

# official image(library/mysql等library配下のもの)
% docker-taglist mysql

library/mysql:latest
library/mysql:8.0.24
library/mysql:8.0
library/mysql:8
library/mysql:5.7.34
library/mysql:5.7
library/mysql:5.6.51
library/mysql:5.6
library/mysql:5
library/mysql:8.0.23

# unofficial image
% docker-taglist mysql/mysql-server

mysql/mysql-server:latest
mysql/mysql-server:8.0.24-1.2.2-server
mysql/mysql-server:8.0.24
mysql/mysql-server:8.0
mysql/mysql-server:8.0.24-aarch64
mysql/mysql-server:8.0-aarch64
mysql/mysql-server:8.0.24-1.2.2-server-aarch64
mysql/mysql-server:latest-aarch64
mysql/mysql-server:8.0.24-1.2.2-server-amd64
mysql/mysql-server:8.0-amd64
%
% docker-taglist gitlab/gitlab-ee

gitlab/gitlab-ee:latest
gitlab/gitlab-ee:nightly
gitlab/gitlab-ee:rc
gitlab/gitlab-ee:13.11.3-ee.0
gitlab/gitlab-ee:13.9.7-ee.0
gitlab/gitlab-ee:13.10.4-ee.0
gitlab/gitlab-ee:13.11.2-ee.0
gitlab/gitlab-ee:13.11.1-ee.0
gitlab/gitlab-ee:13.11.0-ee.0
gitlab/gitlab-ee:13.10.3-ee.0

ページネーションも可能で,一度に多くのtagを取りたい場合は第二引数に取得ページ数を指定する.今回の実装では指定したページのみを取得するのではなく,指定されたページ数分全部を取得する.

% docker-taglist gitlab/gitlab-ee 2

gitlab/gitlab-ee:latest
gitlab/gitlab-ee:nightly
gitlab/gitlab-ee:rc
gitlab/gitlab-ee:13.11.3-ee.0
gitlab/gitlab-ee:13.9.7-ee.0
gitlab/gitlab-ee:13.10.4-ee.0
gitlab/gitlab-ee:13.11.2-ee.0
gitlab/gitlab-ee:13.11.1-ee.0
gitlab/gitlab-ee:13.11.0-ee.0
gitlab/gitlab-ee:13.10.3-ee.0
gitlab/gitlab-ee:13.9.6-ee.0
gitlab/gitlab-ee:13.8.8-ee.0
gitlab/gitlab-ee:13.10.2-ee.0
gitlab/gitlab-ee:13.8.7-ee.0
gitlab/gitlab-ee:13.9.5-ee.0
gitlab/gitlab-ee:13.10.1-ee.0
gitlab/gitlab-ee:13.10.0-ee.0
gitlab/gitlab-ee:13.7.9-ee.0
gitlab/gitlab-ee:13.8.6-ee.0
gitlab/gitlab-ee:13.9.4-ee.0

これでいちいちdocker hubを見に行ってtagを確認したりせずにCLIからサクサクdocker pullできている.いい感じだ.

References