コンテナー レジストリにコンテナー イメージをインポートする
Docker コマンドを使用せず、Azure コンテナー レジストリにコンテナー イメージを簡単にインポート (コピー) できます。 たとえば、開発レジストリのイメージを運用レジストリにインポートしたり、パブリック レジストリから基本イメージをコピーしたりすることができます。
Azure Container Registry は、既存のレジストリからイメージおよびその他の成果物をコピーする多くの一般的なシナリオに対応しています。
パブリック レジストリからイメージをインポートする
同じまたは別の Azure サブスクリプションまたはテナント内にある別の Azure コンテナー レジストリから Helm 3 グラフを含むイメージまたは OCI 成果物をインポートする
Azure 以外のプライベート コンテナー レジストリからインポートする
Azure コンテナー レジストリにイメージをインポートするやり方は、Docker CLI コマンドを使用する場合と比べて次のような利点があります。
クライアント環境にローカルの Docker をインストールする必要がない場合、サポートされている OS の種類に関係なく、任意のコンテナー イメージをインポートできます。
マルチ アーキテクチャ イメージ (公式の Docker イメージなど) をインポートすると、マニフェストの一覧で指定されたすべてのアーキテクチャとプラットフォームのイメージがコピーされます。
ターゲット レジストリへのアクセス権がある場合、レジストリのパブリック エンドポイントは必要ありません。
重要
- イメージをインポートするには、外部レジストリで RFC 7233 がサポートされている必要があります。 失敗を回避するには、RFC 7233 の範囲がサポートされているレジストリを使用し、さらにレジストリ URI を含めて az acr import コマンドを使用することをお勧めします。
制限事項
- インポートされたイメージのマニフェストの最大数は 50 です。
- パブリック レジストリからインポートされるイメージの最大レイヤー サイズは 2 GiB です。
コンテナー イメージをインポートするには、Azure CLI を Azure Cloud Shell またはローカルで実行する必要があります (バージョン 2.0.55 以降を推奨します)。 バージョンを確認するには、az --version
を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。
Note
複数の Azure リージョンに同じコンテナー イメージを配布する必要がある場合、Azure Container Registry では geo レプリケーションもサポートされます。 レジストリの geo レプリケーション (Premium サービス レベルが必要) を行うと、1 つのレジストリに含まれる同一のイメージとタグ名を、複数のリージョンで使用できます。
重要
2 つの Azure コンテナー レジストリ間でのイメージのインポートに対する変更は、2021 年 1 月の時点で導入されました。
- ネットワーク制限付きの Azure コンテナー レジストリとの間でインポートを行うには、ネットワークをバイパスできるように、制限付きレジストリで信頼されたサービスによるアクセスを許可する必要があります。 既定では、この設定は有効で、インポートが可能になっています。 プライベート エンドポイントまたはレジストリ ファイアウォール規則を使用する新しく作成されたレジストリで設定が有効になっていない場合、インポートは失敗します。
- インポートのソースまたはターゲットとして使用される既存のネットワーク制限付き Azure コンテナー レジストリでは、このネットワーク セキュリティ機能を有効にすることは、任意ですが推奨されます。
前提条件
まだ Azure コンテナー レジストリがない場合は、レジストリを作成します。 手順については、「クイック スタート: Azure CLI を使用したプライベート コンテナー レジストリの作成」を参照してください。
Azure コンテナー レジストリにイメージをインポートするには、使用する ID に、ターゲット レジストリへの書き込みアクセス許可 (少なくとも共同作成者ロールか、importImage アクションを許可するカスタム ロール) が付与されている必要があります。 「Azure Container Registry のロールとアクセス許可」をご覧ください。
パブリック レジストリからインポートする
重要
パブリック レジストリからネットワークで制限された Azure コンテナー レジストリにインポートするには、ネットワークをバイパスできるように、制限付きレジストリで信頼されたサービスによるアクセスを許可する必要があります。既定では、この設定は有効で、インポートが可能になっています。 プライベート エンドポイントまたはレジストリ ファイアウォール規則を使用する新しく作成されたレジストリで設定が有効になっていない場合、インポートは失敗します。
Docker Hub からインポートする
たとえば、az acr import コマンドを使用して、Docker Hub から myregistry というレジストリに、マルチ アーキテクチャの hello-world:latest
イメージをインポートすることができます。 hello-world
は Docker Hub からの公式イメージなので、このイメージは既定の library
リポジトリにあります。 --source
イメージのパラメーターには、リポジトリ名と、必要に応じてタグの値を指定します (タグではなく、マニフェスト ダイジェストでイメージを識別することもできます。これにより、特定のバージョンのイメージが使用されることを保証できます)。
az acr import \
--name myregistry \
--source docker.io/library/hello-world:latest \
--image hello-world:latest
az acr manifest list-metadata コマンドを実行することで、このイメージに複数のマニフェストが関連付けられていることを確認できます。
az acr manifest list-metadata \
--name hello-world \
--registry myregistry
タグを追加せずにダイジェストで成果物をインポートするには:
az acr import \
--name myregistry \
--source docker.io/library/hello-world@sha256:abc123 \
--repository hello-world
Docker Hub アカウントがある場合は、Docker Hub からイメージをインポートするときに資格情報を使用することをお勧めします。 Docker Hub のユーザー名とパスワード、または個人用アクセストークンをパラメーターとして az acr import
に渡します。 次の例では、Docker Hub 資格情報を使用して、Docker Hub の tensorflow
リポジトリからパブリック イメージをインポートします。
az acr import \
--name myregistry \
--source docker.io/tensorflow/tensorflow:latest-gpu \
--image tensorflow:latest-gpu
--username <Docker Hub user name>
--password <Docker Hub token>
Microsoft Container Registry からインポートする
たとえば、Microsoft Container Registry 内の windows
リポジトリから ltsc2019
Windows Server Core イメージをインポートすることができます。
az acr import \
--name myregistry \
--source mcr.microsoft.com/windows/servercore:ltsc2019 \
--image servercore:ltsc2019
同じ AD テナント内の Azure コンテナー レジストリからインポートする
統合された Microsoft Entra アクセス許可を使用して、同じ AD テナント内の Azure コンテナー レジストリからイメージをインポートできます。
使用する ID には、ソース レジストリからの読み取り (閲覧者ロール) と、ターゲット レジストリへのインポート (共同作成者ロールか、importImage アクションを許可するカスタム ロール) のための Microsoft Entra アクセス許可が付与されている必要があります。
レジストリの場所は、同じ Active Directory テナント内であれば、同じ Azure サブスクリプション内でも、別の Azure サブスクリプション内でも構いません。
ソース レジストリへのパブリック アクセスは無効になっています。 パブリック アクセスが無効になっている場合、レジストリ ログイン サーバー名ではなく、リソース ID でソース レジストリを指定します。
プライベート エンドポイントまたはレジストリ ファイアウォール規則を持つソース レジストリまたはターゲット レジストリでは、制限されたレジストリにより、信頼されたサービスがネットワークにアクセスできることを確認する必要があります。
同じサブスクリプション内のレジストリからインポートする
たとえば、ソース レジストリ mysourceregistry にある aci-helloworld:latest
イメージを、同じ Azure サブスクリプション内の myregistry にインポートできます。
az acr import \
--name myregistry \
--source mysourceregistry.azurecr.io/aci-helloworld:latest \
--image aci-helloworld:latest
次の例では、レジストリのパブリック エンドポイントが無効になっているソース レジストリ mysourceregistry から myregistry に aci-helloworld:latest
イメージがインポートされます。 ソース レジストリのリソース ID は、--registry
パラメーターを使用して指定しています。 --source
パラメーターには、レジストリ ログイン サーバー名ではなく、ソース リポジトリとタグのみを指定することに注意してください。
az acr import \
--name myregistry \
--source aci-helloworld:latest \
--image aci-helloworld:latest \
--registry /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/sourceResourceGroup/providers/Microsoft.ContainerRegistry/registries/mysourceregistry
次の例では、タグではなくマニフェスト ダイジェスト (sha256:...
として表される SHA-256 ハッシュ) によってイメージをインポートしています。
az acr import \
--name myregistry \
--source mysourceregistry.azurecr.io/aci-helloworld@sha256:123456abcdefg
別のサブスクリプション内のレジストリからインポートする
Note
あるレジストリから別のレジストリにイメージをインポートするには、ソースおよびターゲット レジストリの両方のリージョンが、サブスクリプションのリソース プロバイダーに属する Azure Container Registry (ACR) に登録されていることを確認する必要があります。
次の例では、 mysourceregistry が、同じ Active Directory テナント内の myregistry とは別のサブスクリプション内にあります。 ソース レジストリのリソース ID は、--registry
パラメーターを使用して指定しています。 --source
パラメーターには、レジストリ ログイン サーバー名ではなく、ソース リポジトリとタグのみを指定することに注意してください。
az acr import \
--name myregistry \
--source aci-helloworld:latest \
--image aci-hello-world:latest \
--registry /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/sourceResourceGroup/providers/Microsoft.ContainerRegistry/registries/mysourceregistry
サービス プリンシパル資格情報を使用してレジストリからインポートする
統合された Active Directory アクセス許可を使用したアクセスができないレジストリからインポートするには、ソース レジストリに対してサービス プリンシパル資格情報を使用できます (該当する場合)。 ソース レジストリへの ACRPull アクセス許可を持つ Active Directory サービス プリンシパルの appID とパスワードを指定します。 サービス プリンシパルは、イメージをレジストリにインポートする必要のある無人のシステム (ビルド システムなど) で使用できます。
az acr import \
--name myregistry \
--source sourceregistry.azurecr.io/sourcerrepo:tag \
--image targetimage:tag \
--username <SP_App_ID> \
--password <SP_Passwd>
別の AD テナント内の Azure コンテナー レジストリからインポートする
別の Microsoft Entra テナント内の Azure コンテナー レジストリからインポートするには、ログイン サーバー名でソース レジストリを指定し、レジストリへのプル アクセスを有効にする資格情報を指定します。
- パブリック アクセスが無効なレジストリを介したテナント間インポートはサポートされていません。
ユーザー名とパスワードを使用したテナント間のインポート
たとえば、リポジトリ スコープのトークンとパスワード、またはソース レジストリへの ACRPull アクセス許可を持つ Active Directory サービス プリンシパルの appID とパスワードを指定します。
az acr import \
--name myregistry \
--source sourceregistry.azurecr.io/sourcerrepo:tag \
--image targetimage:tag \
--username <SP_App_ID> \
--password <SP_Passwd>
アクセス トークンを使用したテナント間のインポート
- パブリック アクセスが無効なレジストリを介したテナント間インポートはサポートされていません。
ソース テナントでレジストリ アクセス許可を持つ ID を使用してソース レジストリにアクセスする場合は、次のようにしてアクセス トークンを取得できます。
# Login to Azure CLI with the identity, for example a user-assigned managed identity
az login --identity --username <identity_ID>
# Get access token returned by `az account get-access-token`
az account get-access-token
ターゲット テナントで、アクセス トークンをパスワードとして az acr import
コマンドに渡します。 ソース レジストリは、ログイン サーバー名を指定します。 このコマンドにはユーザー名は不要です。
az acr import \
--name myregistry \
--source sourceregistry.azurecr.io/sourcerrepo:tag \
--image targetimage:tag \
--password <access-token>
Azure 以外のプライベート コンテナー レジストリからインポートする
Azure 以外のプライベート レジストリからイメージをインポートするには、レジストリへのプル アクセスを有効にする資格情報を指定します。 たとえば、次のようにして、プライベート Docker レジストリからイメージをプルします。
az acr import \
--name myregistry \
--source docker.io/sourcerepo/sourceimage:tag \
--image sourceimage:tag \
--username <username> \
--password <password>
次のステップ
この記事では、パブリック レジストリや別のプライベート レジストリから Azure コンテナー レジストリにコンテナー イメージをインポートする方法について説明しました。
- 追加のイメージ インポート オプションについては、az acr import コマンドのリファレンスをご覧ください。
イメージのインポートを利用すると、別の Azure リージョン、サブスクリプション、または Microsoft Entra テナントのコンテナー レジストリにコンテンツを移動できます。 詳細については、「コンテナー レジストリを別のリージョンに手動で移動する」を参照してください。
ネットワーク制限付きコンテナー レジストリからの成果物のエクスポートを無効にします。