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