よく寄せられる質問 - Azure Stack Hub 上の Azure Container Registry

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

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

リソース管理

Azure Stack Hub に Resource Manager テンプレートを使用して Azure Container Registry を作成できますか?

はい。 レジストリの 作成に使用できるテンプレートを次に示します。 このテンプレートは、Azure パブリック クラウド用です。 Azure Stack Hub に対してこのテンプレートを使用するには、API バージョンを 2019-05-01 に変更します。それ以外の場合はデプロイに失敗します。

Azure Stack Hub 上の ACR のイメージのスキャンにセキュリティ上の脆弱性はありますか?

いいえ。 現在、Azure Stack Hub にデプロイされたレジストリの Azure Security Center との統合はありません。 接続または切断されている Azure Stack Hub のデプロイに対し、この要求を満たすオプションが、サード パーティおよびオープン ソースによって提供されています。

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]"
}

Kubernetes を実行している切断された Azure Stack Hub デプロイに Azure Container Registry 内のコンテナー イメージをプッシュする方法

必要なコンテナー イメージが既にあるマシンから、ローカル ネットワーク経由でマシン間のイメージ転送を実行できます。 これを行うには、次の手順を実行します。

  1. まず、インターネットに接続できるマシンを使い、docker CLI および docker pull コマンドを使って、必要なコンテナー イメージを取得します。 詳細については、「コンテナー レジストリにコンテナー イメージをインポートする」を参照してください。

  2. 必要なイメージをインポートしたら、切断された Azure Hub インスタンスの場所にマシンを転送します。

  3. docker tagdocker push のコマンドを使って、イメージにタグを付け、Azure Stack Hub リポジトリ上のローカル Azure コンテナー レジストリにプッシュします。

レジストリの操作

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

ACR は Docker Registry HTTP API V2 をサポートしています。 これらの API には `https:///v2/` でアクセスできます。 例: https://mycontainerregistry.azsacr.<regionname>.<fqdn>/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 --registry myRegistry --query "[?tags[0]==null].digest" --output tsv | %{ az acr repository delete --name myRegistry --image myRepository@$_ }

Note

削除コマンドで `-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.azsacr.<regionname>.<fqdn>/1gb:latest .
docker push myregistry.azsacr.<regionname>.<fqdn>/1gb:latest

ストレージの使用量の増加を、Azure Stack Hub 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 Stack Hub 上の Azure Container Registry は、コンテンツの信頼をサポートしていますか?

いいえ。Azure Stack Hub 上の現在の Azure Container Registry のリリースは "Standard" SKU のみをサポートし、コンテンツの信頼はサポートしていません。

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

ACR は、さまざまなレベルのアクセス許可を提供する[カスタム ロール](container-registry-roles.md)をサポートしています。 具体的には、`AcrPull` および `AcrPush` ロールを使用すると、ユーザーは Azure でレジストリ リソースを管理するためのアクセス許可なしで、イメージのプルまたはプッシュ、あるいはその両方を行うことができます。

  • Azure Stack Hub portal: レジストリ -> [アクセス制御 (IAM)] -> [追加] (ロールの AcrPull または AcrPush を選択)。

  • Azure CLI:次のコマンドを実行して、レジストリのリソース ID を見つけます。

    az acr show -n myRegistry
    

    その後、ユーザーに `AcrPull` または `AcrPush` ロールを割り当てることができます (次の例では `AcrPull` を使用しています)。

    az role assignment create --scope resource_id --role AcrPull --assignee user@example.com
    

    または、そのアプリケーション ID で識別されたサービス プリンシパルにロールを割り当てます。

    az role assignment create --scope resource_id --role AcrPull --assignee 00000000-0000-0000-0000-000000000000
    

それにより、アサイニーは、レジストリ内のイメージの認証やアクセスが可能になります。

  • レジストリを認証するには:

    az acr login -n myRegistry 
    
  • リポジトリを一覧表示するには:

    az acr repository list -n myRegistry
    
  • イメージをプルするには:

    docker pull myregistry.azsacr.<regionname>.<fqdn>/hello-world
    

`AcrPull` または `AcrPush` ロールを使用しただけでは、アサイニーに Azure でレジストリ リソースを管理するためのアクセス許可は与えられません。 たとえば、`az acr list` または `az acr show -n myRegistry` でレジストリは表示されません。

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

マニフェスト内の非再頒布可能レイヤーには、コンテンツのフェッチ元となる可能性がある 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.azsacr.<regionname>.<fqdn>"]
    }
    

    Note

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

  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 プル速度が遅い

お使いのコンピューターのネットワーク ダウンロード速度をテストするには、[この](http://www.azurespeed.com/Azure/Download)ツールを使用します。

Docker プッシュ速度が遅い

お使いのコンピューターのネットワーク アップロード速度をテストするには、[この](http://www.azurespeed.com/Azure/Upload)ツールを使用します。

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.azsacr.<regionname>.<fqdn>/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    
}

次に、このデーモンを再起動します。 たとえば、Ubuntu 14.04 では次のようにします。

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.azsacr.<regionname>.<fqdn>
    docker login myregistry.azsacr.<regionname>.<fqdn>
    

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 Stack Hub portal にすべてのリポジトリまたはタグが一覧表示されないのはなぜですか?

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

Azure Stack Hub portal でリポジトリまたはタグが取り込まれないのはなぜですか?

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

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

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

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

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

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

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

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

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

前提条件

  • Fiddler で https の復号化を有効にします: https://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/DecryptHTTPS
  • Docker UI を使用して、Docker によるプロキシの使用を有効にします:
  • 完了したら必ず元に戻してください。 これが有効になっていて、Fiddler が実行されていない場合、Docker は機能しません。

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)。

次のステップ

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