azure-containerregistry-py — скилл Claude Code: ACR и установка
Скилл подсказывает, как работать с Azure Container Registry через Python: репозитории, образы, манифесты и теги. Нужен при задачах с ACR.
npx skills add microsoft/skills --skill azure-containerregistry-py -a claude-codeЧто делает azure-containerregistry-py
Скилл описывает работу с Azure Container Registry через пакет azure-containerregistry. Он помогает получать список репозиториев, читать и менять их свойства, управлять тегами и манифестами, скачивать манифесты и слои артефактов. Для очистки старых образов показан сценарий с удалением манифестов без тегов.
В примерах используются ContainerRegistryClient, DefaultAzureCredential, синхронный и асинхронный API. Клиент и учётные данные оборачиваются в контекстные менеджеры. Для подключения нужен AZURE_CONTAINERREGISTRY_ENDPOINT; при использовании DefaultAzureCredential в production задаётся AZURE_TOKEN_CREDENTIALS=prod. Без endpoint в переменной окружения клиент не подключится.
Какие задачи решает
- получить список репозиториев Azure Container Registry
- проверить свойства образа, манифеста или тега
- запретить удаление и запись в репозитории
- скачать манифест или слой артефакта
- удалить старые манифесты без тегов
Примеры запросов агенту
- Покажи Python-код для списка репозиториев через
ContainerRegistryClientиDefaultAzureCredential. - Проверь свойства образа
my-image, его манифестов и тегов в Azure Container Registry. - Составь скрипт, который удалит манифесты без тегов после заданной даты и скачает слой в
layer.tar.gz.
Как установить azure-containerregistry-py
1Через Skills CLI (Vercel)
npx skills add microsoft/skills --skill azure-containerregistry-py -a claude-code2Вручную: положить файлы
~/.claude/skills/azure-containerregistry-py/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/azure-containerregistry-py/
Вручную: положить файлы
.agents/skills/azure-containerregistry-py/SKILL.mdДля всех проектов — ~/.agents/skills/
Вручную: положить файлы
.cursor/skills/azure-containerregistry-py/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install microsoft/skills azure-containerregistry-py2Вручную: положить файлы
.github/skills/azure-containerregistry-py/SKILL.mdКомандой платформы
gemini skills install https://github.com/microsoft/skills --path .github/plugins/azure-sdk-python/skills/azure-containerregistry-pyВручную: положить файлы
.devin/skills/azure-containerregistry-py/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Claude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о azure-containerregistry-py
Как установить azure-containerregistry-py в Claude Code?
Выполните npx skills add microsoft/skills --skill azure-containerregistry-py -a claude-code, затем проверьте файл ~/.claude/skills/azure-containerregistry-py/SKILL.md.
Что делает azure-containerregistry-py?
Скилл помогает писать Python-код для Azure Container Registry: управлять репозиториями, тегами, манифестами и артефактами через ContainerRegistryClient.
Что нужно для подключения к Azure Container Registry?
Нужна переменная AZURE_CONTAINERREGISTRY_ENDPOINT. Для DefaultAzureCredential в production также задайте AZURE_TOKEN_CREDENTIALS=prod.
Исходный текст
SKILL.md · MIT
---
name: azure-containerregistry-py
description: |
Azure Container Registry SDK for Python. Use for managing container images, artifacts, and repositories.
Triggers: "azure-containerregistry", "ContainerRegistryClient", "container images", "docker registry", "ACR".
license: MIT
metadata:
author: Microsoft
version: "1.0.0"
package: azure-containerregistry
---
# Azure Container Registry SDK for Python
Manage container images, artifacts, and repositories in Azure Container Registry.
## Installation
```bash
pip install azure-containerregistry
```
## Environment Variables
```bash
AZURE_CONTAINERREGISTRY_ENDPOINT=https://<registry-name>.azurecr.io # Required for all auth methods
AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production
```
## Authentication & Lifecycle
> **🔑 Two rules apply to every code sample below:**
>
> 1. **Prefer `DefaultAzureCredential`.** It works locally (Azure CLI / VS Code / Developer CLI) and in Azure (managed identity, workload identity) with no code change. Avoid connection strings, account/API keys — they bypass Entra audit and rotation.
> - Local dev: `DefaultAzureCredential` works as-is.
> - Production: set `AZURE_TOKEN_CREDENTIALS=prod` (or `AZURE_TOKEN_CREDENTIALS=<specific_credential>`) to constrain the credential chain to production-safe credentials.
> 2. **Wrap every client in a context manager** so HTTP transports, sockets, and token caches are released deterministically:
> - Sync: `with <Client>(...) as client:`
> - Async: `async with <Client>(...) as client:` **and** `async with DefaultAzureCredential() as credential:` (from `azure.identity.aio`)
>
> Snippets may abbreviate this setup, but production code should always follow both rules.
### Entra ID (Recommended)
```python
import os
from azure.containerregistry import ContainerRegistryClient
from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
# Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
credential = DefaultAzureCredential(require_envvar=True)
# Or use a specific credential directly in production:
# See https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credential = ManagedIdentityCredential()
with ContainerRegistryClient(
endpoint=os.environ["AZURE_CONTAINERREGISTRY_ENDPOINT"],
credential=credential
) as client:
# Use client here (see following sections for operations)
...
```
### Anonymous Access (Public Registry)
```python
from azure.containerregistry import ContainerRegistryClient
with ContainerRegistryClient(
endpoint="https://mcr.microsoft.com",
credential=None,
audience="https://mcr.microsoft.com"
) as client:
# Use client here (see following sections for operations)
...
```
## List Repositories
```python
with ContainerRegistryClient(endpoint, DefaultAzureCredential()) as client:
for repository in client.list_repository_names():
print(repository)
```
## Repository Operations
### Get Repository Properties
```python
properties = client.get_repository_properties("my-image")
print(f"Created: {properties.created_on}")
print(f"Modified: {properties.last_updated_on}")
print(f"Manifests: {properties.manifest_count}")
print(f"Tags: {properties.tag_count}")
```
### Update Repository Properties
```python
from azure.containerregistry import RepositoryProperties
client.update_repository_properties(
"my-image",
properties=RepositoryProperties(
can_delete=False,
can_write=False
)
)
```
### Delete Repository
```python
client.delete_repository("my-image")
```
## List Tags
```python
for tag in client.list_tag_properties("my-image"):
print(f"{tag.name}: {tag.created_on}")
```
### Filter by Order
```python
from azure.containerregistry import ArtifactTagOrder
# Most recent first
for tag in client.list_tag_properties(
"my-image",
order_by=ArtifactTagOrder.LAST_UPDATED_ON_DESCENDING
):
print(f"{tag.name}: {tag.last_updated_on}")
```
## Manifest Operations
### List Manifests
```python
from azure.containerregistry import ArtifactManifestOrder
for manifest in client.list_manifest_properties(
"my-image",
order_by=ArtifactManifestOrder.LAST_UPDATED_ON_DESCENDING
):
print(f"Digest: {manifest.digest}")
print(f"Tags: {manifest.tags}")
print(f"Size: {manifest.size_in_bytes}")
```
### Get Manifest Properties
```python
manifest = client.get_manifest_properties("my-image", "latest")
print(f"Digest: {manifest.digest}")
print(f"Architecture: {manifest.architecture}")
print(f"OS: {manifest.operating_system}")
```
### Update Manifest Properties
```python
from azure.containerregistry import ArtifactManifestProperties
client.update_manifest_properties(
"my-image",
"latest",
properties=ArtifactManifestProperties(
can_delete=False,
can_write=False
)
)
```
### Delete Manifest
```python
# Delete by digest
client.delete_manifest("my-image", "sha256:abc123...")
# Delete by tag
manifest = client.get_manifest_properties("my-image", "old-tag")
client.delete_manifest("my-image", manifest.digest)
```
## Tag Operations
### Get Tag Properties
```python
tag = client.get_tag_properties("my-image", "latest")
print(f"Digest: {tag.digest}")
print(f"Created: {tag.created_on}")
```
### Delete Tag
```python
client.delete_tag("my-image", "old-tag")
```
## Upload and Download Artifacts
```python
from azure.containerregistry import ContainerRegistryClient
with ContainerRegistryClient(endpoint, DefaultAzureCredential()) as client:
# Download manifest
manifest = client.download_manifest("my-image", "latest")
print(f"Media type: {manifest.media_type}")
print(f"Digest: {manifest.digest}")
# Download blob
blob = client.download_blob("my-image", "sha256:abc123...")
with open("layer.tar.gz", "wb") as f:
for chunk in blob:
f.write(chunk)
```
## Async Client
```python
from azure.containerregistry.aio import ContainerRegistryClient
from azure.identity.aio import DefaultAzureCredential
async def list_repos():
async with DefaultAzureCredential() as credential:
async with ContainerRegistryClient(endpoint, credential) as client:
async for repo in client.list_repository_names():
print(repo)
```
## Clean Up Old Images
```python
from datetime import datetime, timedelta, timezone
cutoff = datetime.now(timezone.utc) - timedelta(days=30)
for manifest in client.list_manifest_properties("my-image"):
if manifest.last_updated_on < cutoff and not manifest.tags:
print(f"Deleting {manifest.digest}")
client.delete_manifest("my-image", manifest.digest)
```
## Client Operations
| Operation | Description |
|-----------|-------------|
| `list_repository_names` | List all repositories |
| `get_repository_properties` | Get repository metadata |
| `delete_repository` | Delete repository and all images |
| `list_tag_properties` | List tags in repository |
| `get_tag_properties` | Get tag metadata |
| `delete_tag` | Delete specific tag |
| `list_manifest_properties` | List manifests in repository |
| `get_manifest_properties` | Get manifest metadata |
| `delete_manifest` | Delete manifest by digest |
| `download_manifest` | Download manifest content |
| `download_blob` | Download layer blob |
## Best Practices
1. **Pick sync OR async and stay consistent.** Do not mix `azure.xxx` sync clients with `azure.xxx.aio` async clients in the same call path. Choose one mode per module.
2. **Always use context managers for clients and async credentials.** Wrap every client in `with Client(...) as client:` (sync) or `async with Client(...) as client:` (async). For async `DefaultAzureCredential` from `azure.identity.aio`, also use `async with credential:` so tokens and transports are cleaned up.
3. **Use Microsoft Entra ID** for authentication in production
4. **Delete by digest** not tag to avoid orphaned images
5. **Lock production images** with can_delete=False
6. **Clean up untagged manifests** regularly
7. **Use async client** for high-throughput operations
8. **Order by last_updated** to find recent/old images
9. **Check manifest.tags** before deleting to avoid removing tagged images
## Reference Files
| File | Contents |
|------|----------|
| [references/capabilities.md](references/capabilities.md) | Additional non-hero capabilities, operation-group coverage, and production checklists. |
| [references/non-hero-scenarios.md](references/non-hero-scenarios.md) | Dedicated non-hero examples for secondary/advanced scenarios. |
© Microsoft · MIT · microsoft/skills