😀

Azure Container Registry (ACR) に Docker Hub からコンテナイメージを直接インポ

に公開

背景と目的

docker build を何回もしてると Docker Hub のダウンロード率制限により 429 Too Many Requests エラーが発生して困ったことが何度かあります。そんな時は自前で立てたコンテナレジストリに手動でダウンロードしたコンテナイメージをプッシュしてから使う、という選択を皆さんもされるのではないかと思います。今回はわざわざコンテナイメージをダウンロードしなくても Azure Container Registry (ACR) に Docker Hub から直接インポートする方法があるので試してみました。

ACR の検証環境を作る

bash
# 環境変数をセットします
region=japaneast
prefix=mnracrdev

# リソースグループを作成します
az group create \
  --name ${prefix}-rg \
  --location $region

# ACR を作成します
az acr create \
  --resource-group ${prefix}-rg \
  --name ${prefix} \
  --sku Basic

Docker Hub の公式イメージをインポート

bash
# 公式イメージには docker.io/library/ をつけます
az acr import \
  --name ${prefix} \
  --source docker.io/library/hello-world:latest \
  --image hello-world:latest

# hello-world が登録されたか確認します
az acr repository list \
  --name ${prefix}

# hello-world のタグを確認します
az acr repository show-tags \
  --name ${prefix} \
  --repository hello-world

めちゃくちゃ便利で簡単ですね!

(参考)イメージのインポートを禁止するカスタムロール

自分の PC にコンテナイメージのダウンロードが必要ないということは、例えばインターネットとの境界にファイアウォールやプロキシなどで制限のある社内の開発環境でも ACR にアクセスして何かしらのデータを外部から持ち込んだりできそうです。そこで参考までに ACR のカスタムロールでインポートを禁止するサンプルも用意しておきたいと思います。

json
{
   "assignableScopes": [
     "/subscriptions/12345678-1234-1234-1234-123456789012"
   ],
   "description": "Custom ACR Role",
   "Name": "CustomAcrUser",
   "permissions": [
     {
       "actions": [
         "Microsoft.ContainerRegistry/registries/push/write",
         "Microsoft.ContainerRegistry/registries/pull/read",
         "Microsoft.ContainerRegistry/registries/read"
       ],
       "dataActions": [],
       "notActions": [
         "Microsoft.ContainerRegistry/registries/importImage/action"
       ],
       "notDataActions": []
     }
   ],
   "roleType": "CustomRole"
 }

検証環境を削除

bash
# リソースグループを削除します
az group delete \
  --name ${prefix}-rg \
  --yes

参考

https://matsuand.github.io/docs.docker.jp.onthefly/docker-hub/download-rate-limit/

https://docs.microsoft.com/ja-jp/azure/container-registry/container-registry-import-images?tabs=azure-cli

https://hub.docker.com/_/hello-world?tab=tags

https://docs.microsoft.com/ja-jp/azure/container-registry/container-registry-roles?tabs=azure-cli

Discussion