この記事では、Azure Container Registry に関するよく寄せられる質問および既知の問題について説明します。
レジストリのトラブルシューティング ガイダンスについては、以下を参照してください。
リソース管理
Azure Resource Manager (ARM) テンプレートを使用して Azure Container Registry (ACR) を作成できますか?
はい。 レジストリを作成するために使用できる
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 を使用して削除されるが、レプリケーションの削除が "許可されていません" 状態で失敗する
このエラーは、ユーザーがレジストリで 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://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@$_ }
注
削除コマンドで
詳細については、「
イメージを削除した後もレジストリ クォータの使用量が減少しないのはなぜですか?
この状況は、基になるレイヤーが他のコンテナイメージによってまだ参照されている場合に発生する可能性があります。 参照されていないイメージを削除した場合、レジストリの使用量は数分以内に更新されます。
ストレージ クォータの変更を検証するにはどうすればよいですか?
次の 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 はコンテンツの信頼をサポートしていますか?
はい、Azure Container Registry の信頼できるイメージを Docker Content Trust と共に使用できます。 詳細については、「
サムプリント用のファイルはどこにありますか?
- 委任ロールを除くすべてのロールの公開キーと証明書は
`root.json` に格納されています。 - 委任ロールの公開キーと証明書は、その親ロール (
`targets/releases` ロールの場合の`targets.json` など) の JSON ファイルに格納されています。
これらの公開鍵と証明書は、DockerおよびNotaryクライアントによって行われた全体的なTUF検証の後に検証する必要があります。
レジストリ リソースを管理する権限を付与せずに、イメージをプルまたはプッシュするためのアクセス権を付与するにはどうすればよいですか?
ACR は、 Microsoft Entra ロールベースのアクセス制御 (RBAC) と 、レジストリ全体にアクセス許可を付与せずにイメージのプッシュまたはプルのアクセス許可を付与するなど、さまざまなレベルの Microsoft Entra ベースのアクセス許可を提供する組み込みロールをサポートしています。
必要に応じて、[Microsoft Entra 属性ベースのアクセス制御 (ABAC)] を使用して、 Microsoft Entra ベースのリポジトリのアクセス許可 を管理し、特定のリポジトリへのロールの割り当てをスコープできます。
レジストリに対するイメージの自動検疫を有効にするにはどうすればよいですか?
イメージの検疫は現在、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"] }
注
値は、コンマで区切られたレジストリ アドレスの配列です。
ファイルを保存して終了します。
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
}
次に、このデーモンを再起動します。
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 または 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 トレースを収集するにはどうすればよいですか?
前提条件
- Fiddler で HTTPS の暗号化解除を有効にする
- Docker UI を 介して Docker でプロキシを使用 できるようにします。
- 完了したら必ず元に戻してください。 Docker は、これが有効になっていて Fiddler が実行されていないと機能しません。
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 |
はい | いいえ |
ビットバケット | https://user@bitbucket.org/user/mayapp-repo.git#mybranch:myfolder |
はい | いいえ |
実行のエラー メッセージのトラブルシューティング
エラー メッセージ | トラブルシューティング ガイド |
---|---|
VM 用にアクセスが構成されていないため、サブスクリプションが見つかりませんでした | これは、ACR タスクで az login --identity を使用している場合に発生する可能性があります。 このエラーは一時的なものであり、マネージド ID のロールの割り当てがまだ反映されていない場合に発生します。 数秒待ってから、操作を再試行してください。 |
CI/CD の統合
[ CircleCI](https://github.com/Azure/acr/blob/master/docs/integration/CircleCI.md) - GitHub のアクション
タイムアウトの問題が原因でエージェント プールの作成が失敗した場合の解決方法
既存のネットワーク セキュリティ グループまたはユーザー定義ルートに対して正しい ファイアウォール規則 を設定します。 セットアップの後、ファイアウォール規則が適用されるまで数分待ちます。
ACR に対して Azure 組み込みポリシーを有効にして、管理者の資格情報の有効化をブロックするにはどうすればよいですか?
次の Azure 組み込みポリシーをそれぞれのポリシー状態に設定すると、ユーザーがレジストリで admin ユーザーを有効にするのがブロックされます。
Azure の組み込みポリシー | ポリシーの状態 | 管理の状態 |
---|---|---|
コンテナー レジストリを構成して、ローカルの管理者アカウントを無効にする | 変更 | 無効にする |
コンテナー レジストリでは、ローカル管理者アカウントが無効になっている必要がある | 拒否 | 無効にする |
コンテナー レジストリでは、ローカル管理者アカウントが無効になっている必要がある | 監査 | 非対応 |
次のステップ
- Azure Container Registry の
[ 詳細を学習](container-registry-intro.md) します。