azure-containerregistry-py

npx skills add https://github.com/microsoft/skills --skill azure-containerregistry-py

SDK Azure Container Registry pour Python

Gérez les images conteneur, les artefacts et les dépôts dans Azure Container Registry.

Installation

pip install azure-containerregistry

Variables d'environnement

AZURE_CONTAINERREGISTRY_ENDPOINT=https://<registry-name>.azurecr.io  # Requis pour toutes les méthodes d'authentification
AZURE_TOKEN_CREDENTIALS=prod # Requis uniquement si DefaultAzureCredential est utilisé en production

Authentification

Entra ID (Recommandé)

import os
from azure.containerregistry import ContainerRegistryClient
from azure.identity import DefaultAzureCredential, ManagedIdentityCredential

# Dev local : DefaultAzureCredential. Production : définissez AZURE_TOKEN_CREDENTIALS=prod ou AZURE_TOKEN_CREDENTIALS=<specific_credential>
credential = DefaultAzureCredential(require_envvar=True)
# Ou utilisez une credential spécifique directement en production :
# Voir https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credential = ManagedIdentityCredential()

client = ContainerRegistryClient(
    endpoint=os.environ["AZURE_CONTAINERREGISTRY_ENDPOINT"],
    credential=credential
)

Accès anonyme (registre public)

from azure.containerregistry import ContainerRegistryClient

client = ContainerRegistryClient(
    endpoint="https://mcr.microsoft.com",
    credential=None,
    audience="https://mcr.microsoft.com"
)

Lister les dépôts

client = ContainerRegistryClient(endpoint, DefaultAzureCredential())

for repository in client.list_repository_names():
    print(repository)

Opérations sur les dépôts

Obtenir les propriétés d'un dépôt

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

Mettre à jour les propriétés d'un dépôt

from azure.containerregistry import RepositoryProperties

client.update_repository_properties(
    "my-image",
    properties=RepositoryProperties(
        can_delete=False,
        can_write=False
    )
)

Supprimer un dépôt

client.delete_repository("my-image")

Lister les tags

for tag in client.list_tag_properties("my-image"):
    print(f"{tag.name}: {tag.created_on}")

Filtrer par ordre

from azure.containerregistry import ArtifactTagOrder

# Les plus récents en premier
for tag in client.list_tag_properties(
    "my-image",
    order_by=ArtifactTagOrder.LAST_UPDATED_ON_DESCENDING
):
    print(f"{tag.name}: {tag.last_updated_on}")

Opérations sur les manifests

Lister les manifests

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

Obtenir les propriétés d'un manifest

manifest = client.get_manifest_properties("my-image", "latest")
print(f"Digest: {manifest.digest}")
print(f"Architecture: {manifest.architecture}")
print(f"OS: {manifest.operating_system}")

Mettre à jour les propriétés d'un manifest

from azure.containerregistry import ArtifactManifestProperties

client.update_manifest_properties(
    "my-image",
    "latest",
    properties=ArtifactManifestProperties(
        can_delete=False,
        can_write=False
    )
)

Supprimer un manifest

# Supprimer par digest
client.delete_manifest("my-image", "sha256:abc123...")

# Supprimer par tag
manifest = client.get_manifest_properties("my-image", "old-tag")
client.delete_manifest("my-image", manifest.digest)

Opérations sur les tags

Obtenir les propriétés d'un tag

tag = client.get_tag_properties("my-image", "latest")
print(f"Digest: {tag.digest}")
print(f"Created: {tag.created_on}")

Supprimer un tag

client.delete_tag("my-image", "old-tag")

Télécharger et charger des artefacts

from azure.containerregistry import ContainerRegistryClient

client = ContainerRegistryClient(endpoint, DefaultAzureCredential())

# Télécharger le manifest
manifest = client.download_manifest("my-image", "latest")
print(f"Media type: {manifest.media_type}")
print(f"Digest: {manifest.digest}")

# Télécharger le blob
blob = client.download_blob("my-image", "sha256:abc123...")
with open("layer.tar.gz", "wb") as f:
    for chunk in blob:
        f.write(chunk)

Client asynchrone

from azure.containerregistry.aio import ContainerRegistryClient
from azure.identity.aio import DefaultAzureCredential

async def list_repos():
    credential = DefaultAzureCredential()
    client = ContainerRegistryClient(endpoint, credential)

    async for repo in client.list_repository_names():
        print(repo)

    await client.close()
    await credential.close()

Nettoyer les anciennes images

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)

Opérations du client

Opération Description
list_repository_names Lister tous les dépôts
get_repository_properties Obtenir les métadonnées du dépôt
delete_repository Supprimer le dépôt et toutes les images
list_tag_properties Lister les tags du dépôt
get_tag_properties Obtenir les métadonnées du tag
delete_tag Supprimer un tag spécifique
list_manifest_properties Lister les manifests du dépôt
get_manifest_properties Obtenir les métadonnées du manifest
delete_manifest Supprimer un manifest par digest
download_manifest Télécharger le contenu du manifest
download_blob Télécharger le blob de la couche

Bonnes pratiques

  1. Utiliser Entra ID pour l'authentification en production
  2. Supprimer par digest et non par tag pour éviter les images orphelines
  3. Verrouiller les images de production avec can_delete=False
  4. Nettoyer régulièrement les manifests sans tag
  5. Utiliser le client asynchrone pour les opérations à haut débit
  6. Trier par last_updated pour trouver les images récentes ou anciennes
  7. Vérifier manifest.tags avant suppression pour éviter de supprimer des images étiquetées

Skills similaires