この記事では、Azure Container Registry に関するよく寄せられる質問および既知の問題について説明します。
レジストリのトラブルシューティング ガイダンスについては、以下を参照してください。
リソース管理
Resource Manager テンプレートを使用して Azure コンテナー レジストリを作成できますか?
はい。 レジストリを作成するために使用できる
ACR 内のイメージに対するセキュリティ脆弱性スキャンは存在しますか?
はい。 Microsoft Defender for Cloud、Twistlock、および Aqua のドキュメントをご覧ください。
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]"
}
レプリケーションは Azure CLI または Azure PowerShell を使用して削除されるが、レプリケーションの削除が "許可されていません" 状態で失敗する
このエラーは、ユーザーがレジストリに対するアクセス許可を持っているが、サブスクリプションに対する閲覧者レベルのアクセス許可を持っていない場合に表示されます。 この問題を解決するには、ユーザーにサブスクリプションに対する閲覧者アクセス許可を割り当てます。
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://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@$_ }
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.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
コンテナーで、
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 はコンテンツの信頼をサポートしていますか?
はい。
サムプリント用のファイルはどこにありますか?
- 委任ロールを除くすべてのロールの公開キーと証明書は
`root.json` に格納されています。 - 委任ロールの公開キーと証明書は、その親ロール (
`targets/releases` ロールの場合の`targets.json` など) の JSON ファイルに格納されています。
Docker および Notary クライアントによって全体的な TUF の検証が行われた後、これらの公開キーと証明書を確認することをお勧めします。
レジストリ リソースを管理するためのアクセス許可なしで、イメージをプルまたはプッシュするためのアクセス権を付与するにはどうすればよいですか?
ACR は、さまざまなレベルのアクセス許可を提供する
Azure 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.azurecr.io/hello-world
レジストリに対するイメージの自動検疫を有効にするにはどうすればよいですか?
イメージの検疫は現在、ACR のプレビュー機能です。 セキュリティ スキャンに正常に合格したイメージのみが通常のユーザーに表示されるように、レジストリの検疫モードを有効にすることができます。 詳細については、
匿名プル アクセスを有効にするにはどうすればよいですか?
詳細については、レジストリ コンテンツの公開に関するページを参照してください。
非再頒布可能レイヤーをレジストリにプッシュするにはどうすればよいですか?
マニフェスト内の非再頒布可能レイヤーには、コンテンツのフェッチ元となる可能性がある 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.azurecr.io"] }
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 プル速度が遅い
お使いのコンピューターのネットワーク ダウンロード速度をテストするには、速度ツールを使用します。 コンピューター ネットワークが遅い場合は、レジストリと同じリージョンで Azure VM を使って、ネットワーク速度を改善することを検討してください。
Docker プッシュ速度が遅い
お使いのコンピューターのネットワーク アップロード速度をテストするには、速度ツールを使用します。 コンピューター ネットワークが遅い場合は、レジストリと同じリージョンで Azure VM を使って、ネットワーク速度を改善することを検討してください。
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.azurecr.io/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 のロール割り当ての遅延。 これは通常は高速ですが、伝播の遅延のために数分かかることがあります。
ACR トークン サーバーでのアクセス許可の遅延に、最大 10 分かかる場合があります。 これを緩和するには、
`docker logout` を実行し、1 分後に同じユーザーで再び認証することができます。docker logout myregistry.azurecr.io docker login myregistry.azurecr.io
ACR は現在、ユーザーによるホーム レプリケーションの削除をサポートしていません。 対処法として、テンプレートにホーム レプリケーションの作成を含めますが、次に示すように
{
"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 の直接呼び出しで認証情報が正しい形式で提供されない
特に (リダイレクトをフォローするために) オプション
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 Portal にすべてのリポジトリまたはタグが一覧表示されないのはなぜですか?
Microsoft Edge または IE ブラウザーを使用している場合は、最大で 100 個のリポジトリまたはタグを表示できます。 レジストリに 100 を超えるリポジトリまたはタグが含まれている場合は、すべてを一覧表示するために Firefox または Chrome ブラウザーを使用することをお勧めします。
Azure portal でリポジトリまたはタグをフェッチできないのはなぜですか?
ブラウザーがリポジトリまたはタグをサーバーにフェッチするための要求を送信できない可能性があります。 次のような理由が考えられます。
- ネットワーク接続の不備
- ファイアウォール
- プライベート アクセスのみを許可するレジストリに対する、公衆ネットワークからのポータルの使用
- 広告ブロッカー
- DNS エラー
ネットワーク管理者に問い合わせるか、ネットワークの構成と接続を確認してください。 Azure CLI を使用して
許可されていない操作エラーで pull または push の要求が失敗するのはなぜですか?
操作が許可されない可能性のあるいくつかのシナリオを次に示します。
- クラシック レジストリはサポートされなくなりました。
[ az acr update](/cli/azure/acr#az_acr_update) か Azure portal を使用して、サポートされている[ サービス レベル](./container-registry-skus.md) にアップグレードしてください。 - イメージやリポジトリがロックされているため、削除や更新を実行できない場合があります。 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 トレースを収集するにはどうすればよいですか?
前提条件
- Fiddler で HTTPS の復号化を有効にします。
- 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)。
タスク
実行を一括で取り消すにはどうすればよいですか?
次のコマンドは、指定されたレジストリ内のすべての実行中のタスクを取り消します。
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 フォルダーを含めるにはどうすればよいですか?
!.git/**
この設定は、
タスクではソース トリガーに対して 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 |
はい | いいえ |
BitBucket | https://user@bitbucket.org/user/mayapp-repo.git#mybranch:myfolder |
はい | いいえ |
実行のエラー メッセージのトラブルシューティング
エラー メッセージ | トラブルシューティング ガイド |
---|---|
VM 用にアクセスが構成されていないため、サブスクリプションが見つかりませんでした | これは、ACR タスクで |
CI/CD の統合
[ CircleCI](https://github.com/Azure/acr/blob/master/docs/integration/CircleCI.md) - GitHub のアクション
タイムアウトの問題が原因でエージェント プールの作成が失敗した場合、解決するにはどうすればよいですか?
既存のネットワーク セキュリティ グループまたはユーザー定義ルートに、正しいファイアウォール規則を設定します。 セットアップの後、ファイアウォール規則が適用されるまで数分待ちます。
ACR に対して Azure 組み込みポリシーを有効にして、管理者の資格情報の有効化をブロックするにはどうすればよいですか?
次の Azure の組み込みポリシーでは、それぞれのポリシーの状態に設定すると、ユーザーがレジストリで管理者ユーザーを有効にできなくなります。
Azure の組み込みポリシー | ポリシーの状態 | 管理の状態 |
---|---|---|
コンテナー レジストリを構成して、ローカルの管理者アカウントを無効にする | 変更 | 無効にする |
コンテナー レジストリでは、ローカル管理者アカウントが無効になっている必要がある | 拒否 | 無効にする |
コンテナー レジストリでは、ローカル管理者アカウントが無効になっている必要がある | Audit | 非対応 |
次のステップ
- Azure Container Registry の
[ 詳細を学習](container-registry-intro.md) します。