次の方法で共有


よく寄せられる質問 - Azure Container Registry

この記事では、Azure Container Registry に関するよく寄せられる質問および既知の問題について説明します。

レジストリのトラブルシューティング ガイダンスについては、以下を参照してください。

リソース管理

Azure Resource Manager (ARM) テンプレートを使用して Azure Container Registry (ACR) を作成できますか?

はい。 レジストリを作成するために使用できる[テンプレート](https://azure.microsoft.com/resources/templates/container-registry/)がここにあります。

ACR 内のイメージに対するセキュリティ脆弱性スキャンは存在しますか?

はい。 Microsoft Defender for CloudTwistlockAqua のドキュメントを参照してください。

Azure Container Registry で Kubernetes を構成するにはどうすればよいですか?

[Kubernetes](https://kubernetes.io/docs/user-guide/images/#using-azure-container-registry-acr) のドキュメントおよび [Azure Kubernetes Service](../aks/cluster-container-registry-integration.md) の手順を参照してください。

コンテナー レジストリの管理者の資格情報を取得するにはどうすればよいですか?

重要

管理者ユーザー アカウントは、主にテストの目的でレジストリにアクセスする 1 人のユーザーのために設計されています。 管理者アカウントの資格情報を複数のユーザーと共有しないようにすることをお勧めします。 ユーザーおよびヘッドレス シナリオ用のサービス プリンシパルには、個人 ID を使用することをお勧めします。 [認証の概要](container-registry-authentication.md)に関するページを参照してください。

管理者の資格情報を取得する前に、レジストリの管理者ユーザーが有効になっていることを確認してください。

Azure CLI を使用して資格情報を取得するには:

az acr credential show -n myRegistry

Azure PowerShell の使用:

Invoke-AzureRmResourceAction -Action listCredentials -ResourceType Microsoft.ContainerRegistry/registries -ResourceGroupName myResourceGroup -ResourceName myRegistry

Resource Manager テンプレートの管理者の資格情報を取得するにはどうすればよいですか?

重要

管理者ユーザー アカウントは、主にテストの目的でレジストリにアクセスする 1 人のユーザーのために設計されています。 管理者アカウントの資格情報を複数のユーザーと共有しないようにすることをお勧めします。 ユーザーおよびヘッドレス シナリオ用のサービス プリンシパルには、個人 ID を使用することをお勧めします。 [認証の概要](container-registry-authentication.md)に関するページを参照してください。

管理者の資格情報を取得する前に、レジストリの管理者ユーザーが有効になっていることを確認してください。

最初のパスワードを取得するには:

{
    "password": "[listCredentials(resourceId('Microsoft.ContainerRegistry/registries', 'myRegistry'), '2017-10-01').passwords[0].value]"
}

2 番目のパスワードを取得するには:

{
    "password": "[listCredentials(resourceId('Microsoft.ContainerRegistry/registries', 'myRegistry'), '2017-10-01').passwords[1].value]"
}

レプリケーションは Azure CLI または Azure PowerShell を使用して削除されるが、レプリケーションの削除が "許可されていません" 状態で失敗する

このエラーは、ユーザーがレジストリで Container Registry Contributor and Data Access Configuration Administrator ロールを持っている (Azure CLI を使用してレプリカを削除できる) が、サブスクリプションに対する閲覧者のアクセス許可がない場合に発生します。 ポータルを使用してレプリカを削除するには、サブスクリプションの閲覧者アクセス権が必要です。 この問題を解決するには、ユーザーにサブスクリプションに対する閲覧者アクセス許可を割り当てます。

az role assignment create --role "Reader" --assignee user@contoso.com --scope /subscriptions/<subscription_id> 

ファイアウォール規則が正常に更新されたのに有効にならない

ファイアウォール規則の変更が反映されるまで時間がかかります。 ファイアウォールの設定を変更した後、数分待ってからこの変更を確認します。

レジストリの操作

Docker Registry HTTP API V2 にアクセスするにはどうすればよいですか?

ACR は Docker Registry HTTP API V2 をサポートしています。 これらの API には `https:///v2/` でアクセスできます。 例: https://mycontainerregistry.azurecr.io/v2/

リポジトリ内のどのタグによっても参照されていないすべてのマニフェストを削除するにはどうすればよいですか?

bashを使用している場合:

az acr manifest list-metadata --name myRepository --registry myRegistry --query "[?tags[0]==null].digest" --output tsv  | xargs -I% az acr repository delete --name myRegistry ---image myRepository@%

PowerShell の場合:

az acr manifest list-metadata --name myRepository --repository myRegistry --query "[?tags[0]==null].digest" --output tsv | %{ az acr repository delete --name myRegistry --image myRepository@$_ }

削除コマンドで `-y` を追加すると、確認をスキップできます。

詳細については、「[Azure Container Registry のコンテナー イメージを削除する](container-registry-delete.md)」を参照してください。

イメージを削除した後もレジストリ クォータの使用量が減少しないのはなぜですか?

この状況は、基になるレイヤーが他のコンテナイメージによってまだ参照されている場合に発生する可能性があります。 参照されていないイメージを削除した場合、レジストリの使用量は数分以内に更新されます。

ストレージ クォータの変更を検証するにはどうすればよいですか?

次の docker ファイルを使用して、1GB のレイヤーを持つイメージを作成します。 この手順により、イメージに、レジストリ内の他のイメージと共有されていないレイヤーが含まれるようになります。

FROM alpine
RUN dd if=/dev/urandom of=1GB.bin  bs=32M  count=32
RUN ls -lh 1GB.bin

docker CLI を使用して、このイメージを構築してレジストリにプッシュします。

docker build -t myregistry.azurecr.io/1gb:latest .
docker push myregistry.azurecr.io/1gb:latest

Azure Portal でストレージの使用量が増加したことを確認できるか、または CLI を使用して使用量にクエリを実行できます。

az acr show-usage -n myregistry

Azure CLI またはポータルを使用してイメージを削除し、数分以内に更新された使用量を確認します。

az acr repository delete -n myregistry --image 1gb

コンテナーで CLI を実行しているときにレジストリに対して認証するにはどうすればよいですか?

Docker ソケットをマウントすることによって Azure CLI コンテナーを実行する必要があります。

docker run -it -v /var/run/docker.sock:/var/run/docker.sock azuresdk/azure-cli-python:dev

コンテナーで、`docker` をインストールします。

apk --update add docker

次に、レジストリに対して認証します。

az acr login -n MyRegistry

TLS 1.2 はどのようにして有効にするのですか?

最新の docker クライアント (バージョン 18.03.0 以上) を使用して TLS 1.2 を有効にします。

重要

2020 年 1 月 13 日以降、Azure Container Registry では、サーバーとアプリケーションからのセキュリティで保護されたすべての接続で TLS 1.2 を使用する必要があります。 TLS 1.0 および 1.1 のサポートは廃止されました。

Azure Container Registry はコンテンツの信頼をサポートしていますか?

はい、Azure Container Registry の信頼できるイメージを Docker Content Trust と共に使用できます。 詳細については、「[Azure Container Registry におけるコンテンツの信頼](container-registry-content-trust.md)」を参照してください。

サムプリント用のファイルはどこにありますか?

`~/.docker/trust/tuf/myregistry.azurecr.io/myrepository/metadata` の下:

  • 委任ロールを除くすべてのロールの公開キーと証明書は `root.json` に格納されています。
  • 委任ロールの公開キーと証明書は、その親ロール (`targets/releases` ロールの場合の `targets.json` など) の JSON ファイルに格納されています。

これらの公開鍵と証明書は、DockerおよびNotaryクライアントによって行われた全体的なTUF検証の後に検証する必要があります。

レジストリ リソースを管理する権限を付与せずに、イメージをプルまたはプッシュするためのアクセス権を付与するにはどうすればよいですか?

ACR は、 Microsoft Entra ロールベースのアクセス制御 (RBAC) と 、レジストリ全体にアクセス許可を付与せずにイメージのプッシュまたはプルのアクセス許可を付与するなど、さまざまなレベルの Microsoft Entra ベースのアクセス許可を提供する組み込みロールをサポートしています。

必要に応じて、[Microsoft Entra 属性ベースのアクセス制御 (ABAC)] を使用して、 Microsoft Entra ベースのリポジトリのアクセス許可 を管理し、特定のリポジトリへのロールの割り当てをスコープできます。

レジストリに対するイメージの自動検疫を有効にするにはどうすればよいですか?

イメージの検疫は現在、ACR のプレビュー機能です。 レジストリの検疫モードを有効にすると、セキュリティスキャンに合格したイメージのみが通常のユーザーに表示されるようになります。 詳細については、[ACR の GitHub リポジトリ](https://github.com/Azure/acr/tree/master/docs/preview/quarantine)に関するページを参照してください。

匿名プル アクセスを有効にするにはどうすればよいですか?

非配布可能レイヤーをレジストリにプッシュするにはどうすればよいですか?

マニフェスト内の非配布可能レイヤーには、コンテンツの取得元となる URL パラメータが含まれています。 非配布レイヤープッシュを有効にするユースケースとして考えられるのは、ネットワークが制限されたレジストリ、アクセスが制限されたエアギャップレジストリ、またはインターネット接続がないレジストリです。

たとえば、VM が Azure コンテナー レジストリからのみイメージをプルできるようにネットワーク セキュリティ グループ (NSG) ルールが設定されている場合、Docker は外部レイヤーまたは非配布可能レイヤーをプルするときにエラーが発生します。 たとえば、Windows Server Core イメージには、マニフェスト内の Azure コンテナー レジストリへの外部レイヤー参照が含まれており、このシナリオではプルは失敗します。

非配布レイヤーのプッシュを有効にするには:

  1. `daemon.json` ファイルを編集します。これは、Linux ホストでは `/etc/docker/` に、Windows Server では `C:\ProgramData\docker\config\daemon.json` にあります。 これまでファイルが空であったと仮定して、次の内容を追加します。

    {
      "allow-nondistributable-artifacts": ["myregistry.azurecr.io"]
    }
    

    値は、コンマで区切られたレジストリ アドレスの配列です。

  2. ファイルを保存して終了します。

  3. Docker を再起動します。

リスト内のレジストリにイメージをプッシュすると、その非配布可能レイヤーがレジストリにプッシュされます。

警告

通常、非配布可能な成果物には、配布および共有できる方法と場所に制限があります。 この機能は、アーティファクトをプライベート レジストリにプッシュする場合にのみ使用します。 再配布不可能な成果物について説明する条項に準拠していることを確認します。

診断と正常性チェック

`az acr check-health` を使用した正常性チェック

環境とレジストリに関する一般的な問題のトラブルシューティングを行うには、「[Azure コンテナー レジストリの正常性のチェック](container-registry-check-health.md)」を参照してください。

docker pull が "net/http: 接続の待機中に要求が取り消されました (ヘッダーの待機中に Client.Timeout を超えました)" というエラーで失敗する

  • このエラーが一時的な問題である場合は、再試行が成功する可能性があります。
  • `docker pull` が引き続き失敗する場合は、Docker デーモンの問題である可能性があります。 この問題は一般に、Docker デーモンを再起動することによって緩和されます。
  • Docker デーモンを再起動してもこの問題が引き続き表示される場合は、コンピューターとの何らかのネットワーク接続の問題である可能性があります。 コンピューター上の一般的なネットワークが正常かどうかを確認するには、次のコマンドを実行してエンドポイントの接続性をテストします。 この接続チェック コマンドを含む最小の`az acr` バージョンは、2.2.9 です。 古いバージョンを使用している場合は、Azure CLI をアップグレードします。
az acr check-health -n myRegistry
  • すべての Docker クライアント操作に対して常に再試行メカニズムを用意する必要があります。

Docker プル速度が遅い

速度ツールを使用して、マシン ネットワークのダウンロード速度をテストします。 マシン ネットワークが低速な場合は、レジストリと同じリージョンで Azure 仮想マシン (VM) を使用してネットワーク速度を向上することを検討してください。

Docker プッシュ速度が遅い

速度ツールを使用して、マシン ネットワークのアップロード速度をテストします。 コンピューター ネットワークが遅い場合は、レジストリと同じリージョンで Azure VM を使って、ネットワーク速度を改善することを検討してください。

docker push は成功するが、docker pull が "権限がありません: 認証が必要です" というエラーで失敗する

このエラーは、`--signature-verification` が既定で有効になっている Red Hat バージョンの Docker デーモンで発生する場合があります。 次のコマンドを実行して、Red Hat Enterprise Linux (RHEL) または Fedora の Docker デーモン オプションを確認できます。

grep OPTIONS /etc/sysconfig/docker

たとえば、Fedora 28 Server には次の docker デーモン オプションがあります。

OPTIONS='--selinux-enabled --log-driver=journald --live-restore'

`--signature-verification=false` がないと、`docker pull` は次のようなエラーで失敗します。

Trying to pull repository myregistry.azurecr.io/myimage ...
unauthorized: authentication required

このエラーを解決するには:

  1. Docker デーモンの構成ファイル `/etc/sysconfig/docker` にオプション `--signature-verification=false` を追加します。 次に例を示します。

    OPTIONS='--selinux-enabled --log-driver=journald --live-restore --signature-verification=false'

  2. 次のコマンドを実行して、Docker デーモン サービスを再起動します。

    sudo systemctl restart docker.service
    

`--signature-verification` の詳細は、`man dockerd` を実行して確認できます。

az acr ログインは成功するが、Docker が "権限がありません: 認証が必要です" というエラーで失敗する

レジストリ リソース名が大文字であるか、`myRegistry` のように大文字と小文字が混在している場合でも、`docker push myregistry.azurecr.io/myimage:latest` のように、サーバー URL にはすべて小文字を使用してください。

Docker デーモンのデバッグ ログを有効にして取得する

`debug` オプションを使用して `dockerd` を起動します。 最初に、Docker デーモンの構成ファイル (`/etc/docker/daemon.json`) が存在しない場合は作成し、`debug` オプションを追加します。

{    
    "debug": true    
}

次に、このデーモンを再起動します。

sudo service docker restart

詳細は、[Docker のドキュメント](https://docs.docker.com/engine/admin/#enable-debugging)で見つけることができます。

  • ログは、システムに応じて異なる場所に生成される可能性があります。 たとえば、Ubuntu 14.04 では `/var/log/upstart/docker.log` です。
    詳細については、[Docker のドキュメント](https://docs.docker.com/engine/admin/#read-the-logs)を参照してください。

  • Docker for Windows の場合、ログは %LOCALAPPDATA%/docker/ の下に生成されます。 ただし、すべてのデバッグ情報はまだ含まれていない可能性があります。

    完全なデーモン ログにアクセスするために、追加の手順がいくつか必要になる場合があります。

    docker run --privileged -it --rm -v /var/run/docker.sock:/var/run/docker.sock -v /usr/local/bin/docker:/usr/local/bin/docker alpine sh
    
    docker run --net=host --ipc=host --uts=host --pid=host -it --security-opt=seccomp=unconfined --privileged --rm -v /:/host alpine /bin/sh
    chroot /host
    

    これで、`dockerd` を実行している VM のすべてのファイルにアクセスできます。 ログは `/var/log/docker.log` にあります。

更新の直後に新しいユーザー アクセス許可が有効にならない場合がある

サービス プリンシパルに新しいアクセス許可 (新しいロール) を付与した場合は、その変更が直ちに有効にならない可能性があります。 次の 2 つの原因が考えられます。

  • Microsoft Entra のロール割り当ての遅延。 これは通常は高速ですが、伝播の遅延のために数分かかることがあります。

  • ACR トークン サーバーでのアクセス許可の遅延に、最大 10 分かかる場合があります。 これを緩和するには、`docker logout` を実行し、1 分後に同じユーザーで再び認証することができます。

    docker logout myregistry.azurecr.io
    docker login myregistry.azurecr.io
    

ACR は現在、ユーザーによるホーム レプリケーションの削除をサポートしていません。 対処法として、テンプレートにホーム レプリケーションの作成を含めますが、次に示すように `"condition": false` を追加することによってその作成をスキップします。

{
    "name": "[concat(parameters('acrName'), '/', parameters('___location'))]",
    "condition": false,
    "type": "Microsoft.ContainerRegistry/registries/replications",
    "apiVersion": "2017-10-01",
    "___location": "[parameters('___location')]",
    "properties": {},
    "dependsOn": [
        "[concat('Microsoft.ContainerRegistry/registries/', parameters('acrName'))]"
     ]
},

REST API の直接呼び出しで認証情報が正しい形式で提供されない

特に (リダイレクトをフォローするために) オプション `-L``--___location` を指定して `curl` ツールを使用すると、`InvalidAuthenticationInfo` エラーが発生する場合があります。 たとえば、`-L` オプションを指定した `curl` と基本認証を使用して BLOB をフェッチすると、

curl -L -H "Authorization: basic $credential" https://$registry.azurecr.io/v2/$repository/blobs/$digest

次の応答が返される場合があります。

<?xml version="1.0" encoding="utf-8"?>
<Error><Code>InvalidAuthenticationInfo</Code><Message>Authentication information is not given in the correct format. Check the value of Authorization header.
RequestId:00000000-0000-0000-0000-000000000000
Time:2019-01-01T00:00:00.0000000Z</Message></Error>

この根本原因は、一部の `curl` 実装では元の要求のヘッダーを使用してリダイレクトをフォローするためです。

この問題を解決するには、ヘッダーなしで手動でリダイレクトをフォローする必要があります。 `curl``-D -` オプションを使用して応答ヘッダーを印刷した後、`Location` ヘッダーを抽出します。

REDIRECT_URL=$(curl -s -D - -H "Authorization: basic $credential" https://$registry.azurecr.io/v2/$repository/blobs/$digest | grep "^Location: " | cut -d " " -f2 | tr -d '\r')
curl $REDIRECT_URL

Azure Portal にすべてのリポジトリまたはタグが一覧表示されないのはなぜですか?

Microsoft Edge または IE ブラウザーを使用している場合は、最大で 100 個のリポジトリまたはタグを表示できます。 レジストリに 100 を超えるリポジトリまたはタグが含まれている場合は、すべてを一覧表示するために Firefox または Chrome ブラウザーを使用することをお勧めします。

Azure portal でリポジトリまたはタグをフェッチできないのはなぜですか?

ブラウザーがリポジトリまたはタグをサーバーにフェッチするための要求を送信できない可能性があります。 次のような理由が考えられます。

  • ネットワーク接続の不備
  • ファイアウォール
  • プライベート アクセスのみを許可するレジストリに対する、公衆ネットワークからのポータルの使用
  • 広告ブロッカー
  • ドメイン ネーム サーバー (DNS) エラー

ネットワーク管理者に問い合わせるか、ネットワークの構成と接続を確認してください。 Azure CLI を使用して `az acr check-health -n yourRegistry` を実行し、ご使用の環境から Container Registry に接続できるかどうかを確認します。 また、ブラウザーでシークレット/プライベート セッションを試して、古いブラウザー キャッシュや Cookie を回避することもできます。

許可されていない操作エラーで pull または push の要求が失敗するのはなぜですか?

操作が許可されない可能性のあるいくつかのシナリオを次に示します。

  • クラシック レジストリはサポートされなくなりました。 az acr update または Azure portal を使用して、サポートされているサービス レベルにアップグレードします。
  • イメージやリポジトリがロックされているため、削除や更新を実行できない場合があります。 az acr repository show コマンドを使用して、現在の属性を表示できます。
  • イメージが検疫状態の場合、一部の操作は許可されません。 検疫の詳細については、[こちら](https://github.com/Azure/acr/tree/master/docs/preview/quarantine)をご覧ください。
  • レジストリが、その[ストレージの上限](container-registry-skus.md#service-tier-features-and-limits)に達した可能性があります。

リポジトリ形式が無効またはサポートされていません

リポジトリ操作でリポジトリ名を指定するときに、「サポートされていないリポジトリ形式」、「無効な形式」、「要求されたデータが存在しません」などのエラーが表示される場合は、名前のスペルと大文字と小文字を確認してください。 有効なリポジトリ名には、小文字の英数字、ピリオド、ダッシュ、アンダースコア、およびスラッシュのみを含めることができます。

Windows で http トレースを収集するにはどうすればよいですか?

前提条件

Windows コンテナー

Docker プロキシを 127.0.0.1:8888 に構成します。

Linux コンテナー

Docker VM 仮想スイッチの IP を見つけます。

(Get-NetIPAddress -InterfaceAlias "*Docker*" -AddressFamily IPv4).IPAddress

Docker プロキシを前のコマンドの出力とポート 8888 に構成します (たとえば、10.0.75.1:8888)。

タスク

実行を一括で取り消すにはどうすればよいですか?

次のコマンドは、指定されたレジストリ内のすべての実行中のタスクを取り消します。

az acr task list-runs -r $myregistry --run-status Running --query '[].runId' -o tsv \
| xargs -I% az acr task cancel-run -r $myregistry --run-id %

az acr build コマンドに .git フォルダーを含めるにはどうすればよいですか?

`az acr build` コマンドにローカルのソース フォルダーを渡した場合、既定では、`.git` フォルダーはアップロードされるパッケージから除外されます。 次の設定を使用して、`.dockerignore` ファイルを作成できます。 これは、コマンドに、アップロードされるパッケージ内の `.git` の下にあるすべてのファイルを復元するよう指示します。

!.git/**

この設定は、`az acr run` コマンドにも適用されます。

タスクではソース トリガーに対して GitLab をサポートしていますか?

現在、ソース トリガーに対して GitLab はサポートされていません。

タスクでサポートされる Git リポジトリ管理サービスは何ですか?

Git サービス ソース コンテキスト 手動ビルド コミット トリガーを使用した自動ビルド
GitHub https://github.com/user/myapp-repo.git#mybranch:myfolder はい はい
Azure Repos https://dev.azure.com/user/myproject/_git/myapp-repo#mybranch:myfolder はい はい
GitLabの https://gitlab.com/user/myapp-repo.git#mybranch:myfolder はい いいえ
ビットバケット https://user@bitbucket.org/user/mayapp-repo.git#mybranch:myfolder はい いいえ

実行のエラー メッセージのトラブルシューティング

エラー メッセージ トラブルシューティング ガイド
VM 用にアクセスが構成されていないため、サブスクリプションが見つかりませんでした これは、ACR タスクで az login --identity を使用している場合に発生する可能性があります。 このエラーは一時的なものであり、マネージド ID のロールの割り当てがまだ反映されていない場合に発生します。 数秒待ってから、操作を再試行してください。

CI/CD の統合

タイムアウトの問題が原因でエージェント プールの作成が失敗した場合の解決方法

既存のネットワーク セキュリティ グループまたはユーザー定義ルートに対して正しい ファイアウォール規則 を設定します。 セットアップの後、ファイアウォール規則が適用されるまで数分待ちます。

ACR に対して Azure 組み込みポリシーを有効にして、管理者の資格情報の有効化をブロックするにはどうすればよいですか?

次の Azure 組み込みポリシーをそれぞれのポリシー状態に設定すると、ユーザーがレジストリで admin ユーザーを有効にするのがブロックされます。

Azure の組み込みポリシー ポリシーの状態 管理の状態
コンテナー レジストリを構成して、ローカルの管理者アカウントを無効にする 変更 無効にする
コンテナー レジストリでは、ローカル管理者アカウントが無効になっている必要がある 拒否 無効にする
コンテナー レジストリでは、ローカル管理者アカウントが無効になっている必要がある 監査 非対応

次のステップ

  • Azure Container Registry の[詳細を学習](container-registry-intro.md)します。