背景と目的
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
参考