コンテナー レジストリにコンテナー イメージをインポートする

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 から myregistryaci-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 コマンドのリファレンスをご覧ください。