Microsoft Artifact Registry (mcr.microsoft.com) にあるコンテナーイメージのタグ一覧を確認する

## 背景と目的

Docker Hub はいつからかダウンロードレート制限をするようになり、検証時などで頻繁にプル要求をするような場合にダウンロードできなくなる事象が発生します。このような背景もあり Docker Hub からダウンロードせずに済むようクラウド事業者側で Docker Hub の代替環境となる Microsoft Artifact Registry (mcr.microsoft.com) などのパブリックなコンテナーレジストリを用意するようになりました。マイクロソフトのドキュメントを読んでいると、mcr.microsoft.com からプルする例を沢山見るようになったのですが、Docker Hub のようにコンテナーイメージのタグ一覧を表示するページがないものがあります。そこで簡単ではありますが、Microsoft Artifact Registry (mcr.microsoft.com) にあるコンテナーイメージのタグ一覧を確認する方法を探してみました。

## マイクロソフトのドキュメント内にあるコンテナーイメージ名を確認

https://learn.microsoft.com/ja-jp/dotnet/architecture/microservices/net-core-net-framework-containers/official-net-docker-images

例えば、こちらのページの一番下に書いてある `mcr.microsoft.com/dotnet/sdk:6.0` を `docker pull` する例を考えます。

## コンテナーイメージをダウンロード

下記のように `mcr.microsoft.com/dotnet/sdk` というコンテナーイメージ名と `6.0` というタグ名でダウンロードします。

```bash:bash
$ docker pull mcr.microsoft.com/dotnet/sdk:6.0
6.0: Pulling from dotnet/sdk
f3ac85625e76: Pull complete 
73ad7fd25453: Pull complete 
9a180599f1e7: Pull complete 
ad9458d67ffc: Pull complete 
31a3331c9d7c: Pull complete 
d48d142e9b3c: Pull complete 
b97ae965b8dd: Pull complete 
b69cef364179: Pull complete 
Digest: sha256:3dfedfc30f95c93c3e1d41a2d376f4d3d6fef665888859b616c3b46dde695b73
Status: Downloaded newer image for mcr.microsoft.com/dotnet/sdk:6.0
mcr.microsoft.com/dotnet/sdk:6.0
```

イメージサイズを確認すると `756MB` でした。

```bash:bash
$ docker images mcr.microsoft.com/dotnet/sdk:6.0
REPOSITORY                     TAG       IMAGE ID       CREATED       SIZE
mcr.microsoft.com/dotnet/sdk   6.0       a4c859a71885   10 days ago   756MB
```

ここで「もっとサイズの小さいコンテナーイメージがあるのではないか？」とか「他にどんなタグのコンテナーイメージがあるんだろう？」と疑問に思います。

## ブラウザでタグの一覧を確認

https://mcr.microsoft.com/en-us/product/dotnet/sdk/tags

こちらのページで Filter に `6.0` を入力します。

![mcr-microsoft-com-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/8e3a1a2b-489d-fe95-b846-2d2d90f3ac29.png)

スクショには含まれていませんが、ページ下の方にはよりコンテナーイメージのサイズが小さい `6.0-alpine` というタグを見つけることができました。

```bash:bash
$ docker pull mcr.microsoft.com/dotnet/sdk:6.0-alpine
6.0-alpine: Pulling from dotnet/sdk
6875df1f5354: Pull complete 
bbe002ca839e: Pull complete 
e9fd4314b4af: Pull complete 
24625c6fe6e8: Pull complete 
2aa18253d0d2: Pull complete 
2cecdb1fdf2d: Pull complete 
Digest: sha256:206e5e725e035358ad40dc23461b048948d0b5c020940d5b54949921ebb2fe53
Status: Downloaded newer image for mcr.microsoft.com/dotnet/sdk:6.0-alpine
mcr.microsoft.com/dotnet/sdk:6.0-alpine

$ docker images mcr.microsoft.com/dotnet/sdk:6.0-alpine
REPOSITORY                     TAG          IMAGE ID       CREATED       SIZE
mcr.microsoft.com/dotnet/sdk   6.0-alpine   1cd0b4b1417a   13 days ago   594MB
```

## 本題のタグ一覧を表示するページがないコンテナーイメージ

https://learn.microsoft.com/ja-jp/azure/container-instances/container-instances-quickstart-portal#create-a-container-instance

例えば、こちらのページにある `mcr.microsoft.com/azuredocs/aci-helloworld` というコンテナーイメージは、Microsoft Artifact Registry (mcr.microsoft.com) をブラウザで探しても該当ページがありません。

![mcr-microsoft-com-02.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/860f0f0d-f04b-9275-3621-acf7029b8879.jpeg)

## 本題のタグ一覧を表示するページがない場合の探し方

対象のコンテナーイメージ名を URL に置き換えてアクセスします。ブラウザでも表示可能です。

`https://mcr.microsoft.com/v2/{コンテナーイメージ名}/tags/list`

```bash:bash
$ curl https://mcr.microsoft.com/v2/azuredocs/aci-helloworld/tags/list
{
  "name": "azuredocs/aci-helloworld",
  "tags": [
    "latest",
    "windows"
  ]
}
```

`latest` と `windows` タグがあるのが確認できます。

## おまけ、コンテナーイメージのマニフェストからアーキテクチャを確認したい場合

`https://mcr.microsoft.com/v2/{コンテナーイメージ名}/manifests/{タグ名}`

```bash:bash
$ curl -s https://mcr.microsoft.com/v2/azuredocs/aci-helloworld/manifests/latest | jq .architecture
"amd64"

$ curl -s https://mcr.microsoft.com/v2/dotnet/sdk/manifests/6.0-alpine | jq .architecture
"amd64"

$ curl -s https://mcr.microsoft.com/v2/dotnet/sdk/manifests/6.0-alpine-arm64v8 | jq .architecture
"arm64"
```

## おまけ、GitHub Codespaces で使われるコンテナーイメージの場合

https://github.com/github/codespaces-django/blob/main/.devcontainer/devcontainer.json

例えば、こちらのサンプルのように `mcr.microsoft.com/devcontainers/universal:2` が使われている場合です。

```bash:bash
$ curl https://mcr.microsoft.com/v2/devcontainers/universal/tags/list
{
  "name": "devcontainers/universal",
  "tags": [
    "2",
    "2-focal",
    "2-linux",
    "2.0",
    "2.0-focal",
    "2.0-linux",
    "2.0.0",
    "2.0.0-focal",
    "2.0.0-linux",
    "2.0.10",
    "2.0.10-focal",
    "2.0.10-linux",
    "2.0.11",
    "2.0.11-focal",
    "2.0.11-linux",
    "2.0.12",
    "2.0.12-focal",
    "2.0.12-linux",
    "2.0.13",
    "2.0.13-focal",
    "2.0.13-linux",
    "2.0.14",
    "2.0.14-focal",
    "2.0.14-linux",
    "2.0.15",
    "2.0.15-focal",
    "2.0.15-linux",
    "2.0.16",
    "2.0.16-focal",
    "2.0.16-linux",
    "2.0.17",
    "2.0.17-focal",
    "2.0.17-linux",
    "2.0.18",
    "2.0.18-focal",
    "2.0.18-linux",
    "2.0.19",
    "2.0.19-focal",
    "2.0.19-linux",
    "2.0.20",
    "2.0.20-focal",
    "2.0.20-linux",
    "2.0.21",
    "2.0.21-focal",
    "2.0.21-linux",
    "2.0.22",
    "2.0.22-focal",
    "2.0.22-linux",
    "2.0.23",
    "2.0.23-focal",
    "2.0.23-linux",
    "2.0.24",
    "2.0.24-focal",
    "2.0.24-linux",
    "2.0.6",
    "2.0.6-focal",
    "2.0.6-linux",
    "2.0.7",
    "2.0.7-focal",
    "2.0.7-linux",
    "2.0.8",
    "2.0.8-focal",
    "2.0.8-linux",
    "2.0.9",
    "2.0.9-focal",
    "2.0.9-linux",
    "2.1",
    "2.1-focal",
    "2.1-linux",
    "2.1.0",
    "2.1.0-focal",
    "2.1.0-linux",
    "dev",
    "dev-focal",
    "dev-linux",
    "focal",
    "latest",
    "linux"
  ]
}

$ curl -s https://mcr.microsoft.com/v2/devcontainers/universal/manifests/2 | jq .architecture
"amd64"
```

## 参考

https://docs.docker.com/docker-hub/download-rate-limit/