この記事では、Azure Container Registry に関するよく寄せられる質問および既知の問題について説明します。
レジストリのトラブルシューティング ガイダンスについては、以下を参照してください。
リソース管理
Azure Stack Hub に Resource Manager テンプレートを使用して Azure Container Registry を作成できますか?
はい。 レジストリの作成に使用できるテンプレート を次に示します。 このテンプレートは、Azure パブリック クラウド用です。 Azure Stack Hub に対してこのテンプレートを使用するには、API バージョンを 2019-05-01 に変更します。それ以外の場合はデプロイに失敗します。
Azure Stack Hub 上の Azure Container Registry でイメージのセキュリティ脆弱性スキャンはありますか?
いいえ。 現在、Azure Stack Hub にデプロイされたレジストリの Azure Security Center との統合はありません。 接続または切断されている Azure Stack Hub のデプロイに対し、この要求を満たすオプションが、サード パーティおよびオープン ソースによって提供されています。
Azure Container Registry で Kubernetes を構成するにはどうすればよいですか?
コンテナー レジストリの管理者の資格情報を取得するにはどうすればよいですか?
重要
管理者ユーザー アカウントは、主にテストの目的でレジストリにアクセスする 1 人のユーザーのために設計されています。 管理者アカウントの資格情報を複数のユーザーと共有しないようにすることをお勧めします。 ユーザーおよびヘッドレス シナリオ用のサービス プリンシパルには、個人 ID を使用することをお勧めします。
管理者の資格情報を取得する前に、レジストリの管理者ユーザーが有効になっていることを確認してください。
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 を使用することをお勧めします。
管理者の資格情報を取得する前に、レジストリの管理者ユーザーが有効になっていることを確認してください。
最初のパスワードを取得するには:
{
"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 内のコンテナー イメージをプッシュする方法
必要なコンテナー イメージが既にあるマシンから、ローカル ネットワーク経由でマシン間のイメージ転送を実行できます。 手順は次のとおりです。
まず、インターネットに接続できるマシンを使い、docker CLI および docker pull コマンドを使って、必要なコンテナー イメージを取得します。 詳細については、「コンテナー レジストリにコンテナー イメージをインポートする」を参照してください。
必要なイメージをインポートしたら、切断された Azure Hub インスタンスの場所にマシンを転送します。
docker tag と docker push のコマンドを使って、イメージにタグを付け、Azure Stack Hub リポジトリ上のローカル Azure コンテナー レジストリにプッシュします。
レジストリの操作
Docker Registry HTTP API V2 にアクセスするにはどうすればよいですか?
Azure Container Registry では、Docker Registry HTTP API V2 がサポートされています。 これらの API には 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
削除コマンドで
詳細については、「
イメージを削除した後もレジストリ クォータの使用量が減少しないのはなぜですか?
この状況は、基になるレイヤーが引き続き他のコンテナー イメージによって参照されている場合に発生することがあります。 参照されていないイメージを削除した場合、レジストリの使用量は数分以内に更新されます。
ストレージ クォータの変更を検証するにはどうすればよいですか?
次の 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
コンテナーで、
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 のみをサポートし、コンテンツの信頼はサポートしていません。
レジストリ リソースを管理するためのアクセス許可なしで、イメージをプルまたはプッシュするためのアクセス権を付与するにはどうすればよいですか?
Azure Container Registry では、さまざまなレベルのアクセス許可を提供する カスタム ロール がサポートされています。 具体的には、
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
非再頒布可能レイヤーをレジストリにプッシュするにはどうすればよいですか?
マニフェスト内の非再頒布可能レイヤーには、コンテンツのフェッチ元となる可能性がある URL パラメーターが含まれています。 非再頒布可能レイヤーのプッシュを有効にするユース ケースとしては、ネットワーク制限付きレジストリ、アクセス制限のあるエアギャップ レジストリ、またはインターネット接続のないレジストリが考えられます。
たとえば、VM によるイメージのプルをお使いの Azure コンテナー レジストリからのみ実行できるように NSG 規則を設定している場合、Docker では、外部または非再頒布可能レイヤーのプル エラーが発生します。 たとえば、Windows Server Core イメージには、マニフェスト内の Azure コンテナー レジストリへの外部レイヤー参照が含まれており、このシナリオではプルは失敗します。
非再頒布可能レイヤーのプッシュを有効にするには:
`daemon.json` ファイルを編集します。これは、Linux ホストでは`/etc/docker/` に、Windows Server では`C:\ProgramData\docker\config\daemon.json` にあります。 これまでファイルが空であったと仮定して、次の内容を追加します。{ "allow-nondistributable-artifacts": ["myregistry.azsacr.<regionname>.<fqdn>"] }
Note
値は、コンマで区切られたレジストリ アドレスの配列です。
ファイルを保存して終了します。
Docker を再起動します。
一覧のレジストリにイメージをプッシュすると、非再頒布可能レイヤーがレジストリにプッシュされます。
警告
非再頒布可能アーティファクトには、通常、頒布と共有の方法と場所に関する制限があります。 この機能は、アーティファクトをプライベート レジストリにプッシュする場合にのみ使用します。 非再頒布可能アーティファクトの再頒布に関するすべての条件を順守していることを確認します。
診断と正常性チェック
`az acr check-health` を使用した正常性チェック
環境とレジストリに関する一般的な問題のトラブルシューティングを行うには、「
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 プル速度が遅い
お使いのコンピューターのネットワーク ダウンロード速度をテストするには、このツールを使用します。
Docker プッシュ速度が遅い
お使いのコンピューターのネットワーク アップロード速度をテストするには、このツールを使用します。
docker push は成功するが、docker pull が "権限がありません: 認証が必要です" というエラーで失敗する
このエラーは、
grep OPTIONS /etc/sysconfig/docker
たとえば、Fedora 28 Server には次の docker デーモン オプションがあります。
OPTIONS='--selinux-enabled --log-driver=journald --live-restore'
Trying to pull repository myregistry.azsacr.<regionname>.<fqdn>/myimage ...
unauthorized: authentication required
このエラーを解決するには:
Docker デーモンの構成ファイル
`/etc/sysconfig/docker` にオプション`--signature-verification=false` を追加します。 次に例を示します。OPTIONS='--selinux-enabled --log-driver=journald --live-restore --signature-verification=false'
次のコマンドを実行して、Docker デーモン サービスを再起動します。
sudo systemctl restart docker.service
az acr ログインは成功するが、Docker が "権限がありません: 認証が必要です" というエラーで失敗する
レジストリ リソース名が大文字であるか、
Docker デーモンのデバッグ ログを有効にして取得する
{
"debug": true
}
次に、このデーモンを再起動します。 たとえば、Ubuntu 14.04 では次のようにします。
sudo service docker restart
詳細は、
ログは、システムに応じて異なる場所に生成される可能性があります。 たとえば、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 のロール割り当ての遅延。 これは通常は高速ですが、伝播の遅延のために数分かかることがあります。
Azure Container Registry トークン サーバーでのアクセス許可の遅延。 これには、最大 10 分かかることがあります。 これを緩和するには、
`docker logout` を実行し、1 分後に同じユーザーで再び認証することができます。docker logout myregistry.azsacr.<regionname>.<fqdn> docker login myregistry.azsacr.<regionname>.<fqdn>
直接 REST API 呼び出しで認証情報が正しい形式で提供されない
特に (リダイレクトをフォローするために) オプション
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>
この根本原因は、一部の
この問題を解決するには、ヘッダーなしで手動でリダイレクトをフォローする必要があります。
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 を使用して
許可されていない操作エラーで pull または push の要求が失敗するのはなぜですか?
操作が許可されない可能性のあるいくつかのシナリオを次に示します。
- イメージやリポジトリがロックされているため、削除や更新を実行できない場合があります。 az acr show repository コマンドを使用して、現在の属性を表示できます。
- イメージが検疫状態の場合、一部の操作は許可されません。 検疫の詳細については、
[ こちら](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 によるプロキシの使用を有効にします: https://docs.docker.com/docker-for-windows/#proxies
- 完了したら必ず元に戻してください。 これが有効になっていて、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) します。