Dela via


Azure Container Registry klientbibliotek för Python – version 1.2.0

Azure Container Registry kan du lagra och hantera containeravbildningar och artefakter i ett privat register för alla typer av containerdistributioner.

Använd klientbiblioteket för Azure Container Registry för att:

  • Visa en lista över avbildningar eller artefakter i ett register
  • Hämta metadata för bilder och artefakter, lagringsplatser och taggar
  • Ange läs-/skriv-/borttagningsegenskaper för registerobjekt
  • Ta bort bilder och artefakter, lagringsplatser och taggar

| KällkodPaket (Pypi) | Paket (Conda) | API-referensdokumentation | REST API-dokumentation | Produktdokumentation

Friskrivning

Stöd för Azure SDK Python-paket för Python 2.7 upphörde den 1 januari 2022. Mer information och frågor finns i https://github.com/Azure/azure-sdk-for-python/issues/20691Python 3.7 eller senare som krävs för att använda det här paketet. Mer information finns i Supportprincip för Azure SDK för Python-version.

Komma igång

Installera paketet

Installera Azure Container Registry-klientbiblioteket för Python med pip:

pip install --pre azure-containerregistry

Förutsättningar

Om du vill skapa ett nytt containerregister kan du använda Azure-portalen, Azure PowerShell eller Azure CLI. Här är ett exempel med Azure CLI:

az acr create --name MyContainerRegistry --resource-group MyResourceGroup --location westus --sku Basic

Autentisera klienten

Azure Identity-biblioteket tillhandahåller enkelt Azure Active Directory-stöd för autentisering. förutsätter AZURE_CLIENT_IDatt miljövariablerna , AZURE_TENANT_IDoch AZURE_CLIENT_SECRET har angetts. Mer information finns i avsnittet Azure Identity Environment variables (Miljövariabler för Azure Identity)DefaultAzureCredential

# Create a ContainerRegistryClient that will authenticate through Active Directory
from azure.containerregistry import ContainerRegistryClient
from azure.identity import DefaultAzureCredential

endpoint = "https://mycontainerregistry.azurecr.io"
audience = "https://management.azure.com"
client = ContainerRegistryClient(endpoint, DefaultAzureCredential(), audience=audience)

Viktiga begrepp

Ett register lagrar Docker-avbildningar och OCI-artefakter. En bild eller artefakt består av ett manifest och lager. En bilds manifest beskriver de lager som utgör bilden och identifieras unikt av dess sammandrag. En bild kan också "taggas" för att ge den ett läsbart alias. En bild eller artefakt kan ha noll eller flera associerade taggar och varje tagg identifierar bilden unikt. En samling avbildningar som delar samma namn men har olika taggar kallas för en lagringsplats.

Mer information finns i Begrepp för containerregister.

Exempel

Följande avsnitt innehåller flera kodfragment som täcker några av de vanligaste ACR Service-uppgifterna, inklusive:

Observera att varje exempel förutsätter att det finns en CONTAINERREGISTRY_ENDPOINT miljövariabel inställd på en sträng som innehåller https:// prefixet och namnet på inloggningsservern, till exempel "https://myregistry.azurecr.io". Anonyma åtkomstexempel hämtar slutpunktsvärde från miljövariabelnCONTAINERREGISTRY_ANONREGISTRY_ENDPOINT.

Visa en lista över lagringsplatser

Iterera genom samlingen med lagringsplatser i registret.

with ContainerRegistryClient(self.endpoint, self.credential) as client:
    # Iterate through all the repositories
    for repository_name in client.list_repository_names():
        print(repository_name)

Lista taggar med anonym åtkomst

Iterera genom samlingen med taggar på lagringsplatsen med anonym åtkomst.

with ContainerRegistryClient(endpoint) as anon_client:
    manifest = anon_client.get_manifest_properties("library/hello-world", "latest")
    print(f"Tags of {manifest.repository_name}: ")
    # Iterate through all the tags
    for tag in manifest.tags:
        print(tag)

Ange artefaktegenskaper

Ange egenskaper för en artefakt.

with ContainerRegistryClient(self.endpoint, self.credential) as client:
    # Set permissions on image "library/hello-world:v1"
    client.update_manifest_properties(
        "library/hello-world",
        "v1",
        can_write=False,
        can_delete=False
    )

Ta bort avbildningar

Ta bort avbildningar som är äldre än de tre första på lagringsplatsen.

with ContainerRegistryClient(self.endpoint, self.credential) as client:
    for repository in client.list_repository_names():
        # Keep the three most recent images, delete everything else
        manifest_count = 0
        for manifest in client.list_manifest_properties(
            repository, order_by=ArtifactManifestOrder.LAST_UPDATED_ON_DESCENDING
        ):
            manifest_count += 1
            if manifest_count > 3:
                # Make sure will have the permission to delete the manifest later
                client.update_manifest_properties(
                    repository,
                    manifest.digest,
                    can_write=True,
                    can_delete=True
                )
                print(f"Deleting {repository}:{manifest.digest}")
                client.delete_manifest(repository, manifest.digest)

Ladda upp bilder

Om du vill ladda upp en fullständig avbildning måste vi ladda upp enskilda lager och konfigurationer. Därefter kan vi ladda upp ett manifest som beskriver en bild eller artefakt och tilldela den en tagg.

self.repository_name = "sample-oci-image"
layer = BytesIO(b"Sample layer")
config = BytesIO(json.dumps(
    {
        "sample config": "content",
    }).encode())
with ContainerRegistryClient(self.endpoint, self.credential) as client:
    # Upload a layer
    layer_digest, layer_size = client.upload_blob(self.repository_name, layer)
    print(f"Uploaded layer: digest - {layer_digest}, size - {layer_size}")
    # Upload a config
    config_digest, config_size = client.upload_blob(self.repository_name, config)
    print(f"Uploaded config: digest - {config_digest}, size - {config_size}")
    # Create an oci image with config and layer info
    oci_manifest = {
        "config": {
            "mediaType": "application/vnd.oci.image.config.v1+json",
            "digest": config_digest,
            "sizeInBytes": config_size,
        },
        "schemaVersion": 2,
        "layers": [
            {
                "mediaType": "application/vnd.oci.image.layer.v1.tar",
                "digest": layer_digest,
                "size": layer_size,
                "annotations": {
                    "org.opencontainers.image.ref.name": "artifact.txt",
                },
            },
        ],
    }
    # Set the image with tag "latest"
    manifest_digest = client.set_manifest(self.repository_name, oci_manifest, tag="latest")
    print(f"Uploaded manifest: digest - {manifest_digest}")

Ladda ned bilder

För att ladda ned en fullständig avbildning måste vi ladda ned dess manifest och sedan ladda ned enskilda lager och konfigurationer.

with ContainerRegistryClient(self.endpoint, self.credential) as client:
    # Get the image
    get_manifest_result = client.get_manifest(self.repository_name, "latest")
    received_manifest = get_manifest_result.manifest
    print(f"Got manifest:\n{received_manifest}")
    
    # Download and write out the layers
    for layer in received_manifest["layers"]:
        # Remove the "sha256:" prefix from digest
        layer_file_name = layer["digest"].split(":")[1]
        try:
            stream = client.download_blob(self.repository_name, layer["digest"])
            with open(layer_file_name, "wb") as layer_file:
                for chunk in stream:
                    layer_file.write(chunk)
        except DigestValidationError:
            print(f"Downloaded layer digest value did not match. Deleting file {layer_file_name}.")
            os.remove(layer_file_name)
        print(f"Got layer: {layer_file_name}")
    # Download and write out the config
    config_file_name = "config.json"
    try:
        stream = client.download_blob(self.repository_name, received_manifest["config"]["digest"])
        with open(config_file_name, "wb") as config_file:
            for chunk in stream:
                config_file.write(chunk)
    except DigestValidationError:
        print(f"Downloaded config digest value did not match. Deleting file {config_file_name}.")
        os.remove(config_file_name)
    print(f"Got config: {config_file_name}")

Ta bort manifest

with ContainerRegistryClient(self.endpoint, self.credential) as client:
    get_manifest_result = client.get_manifest(self.repository_name, "latest")
    # Delete the image
    client.delete_manifest(self.repository_name, get_manifest_result.digest)

Ta bort blob

with ContainerRegistryClient(self.endpoint, self.credential) as client:
    get_manifest_result = client.get_manifest(self.repository_name, "latest")
    received_manifest = get_manifest_result.manifest
    # Delete the layers
    for layer in received_manifest["layers"]:
        client.delete_blob(self.repository_name, layer["digest"])
    # Delete the config
    client.delete_blob(self.repository_name, received_manifest["config"]["digest"])

Felsökning

Information om felsökning finns i felsökningsguiden.

Allmänt

ACR-klientbiblioteket genererar undantag som definierats i Azure Core.

Loggning

Det här biblioteket använder standardloggningsbiblioteket för loggning.

Grundläggande information om HTTP-sessioner (URL:er, rubriker osv.) loggas på INFO nivå.

Detaljerad DEBUG nivåloggning, inklusive begärande-/svarskroppar och oredigerade rubriker, kan aktiveras på klienten eller per åtgärd med nyckelordsargumentet logging_enable .

Se fullständig SDK-loggningsdokumentation med exempel här.

Valfri konfiguration

Valfria nyckelordsargument kan skickas in på klient- och åtgärdsnivå. Referensdokumentationen för azure-core beskriver tillgängliga konfigurationer för återförsök, loggning, transportprotokoll med mera.

Nästa steg

Bidra

Det här projektet välkomnar bidrag och förslag. Merparten av bidragen kräver att du godkänner ett licensavtal för bidrag, där du deklarerar att du har behörighet att bevilja oss rättigheten att använda ditt bidrag, och att du dessutom uttryckligen gör så. Mer information finns i cla.microsoft.com.

Det här projektet använder sig av Microsofts uppförandekod för öppen källkod. Mer information finns i Vanliga frågor och svar om uppförandekoden eller kontakta opencode@microsoft.com med ytterligare frågor eller kommentarer.

Visningar