Delen via


Azure Container Registry clientbibliotheek voor Python - versie 1.2.0

met Azure Container Registry kunt u containerinstallatiekopieën en artefacten opslaan en beheren in een privéregister voor alle typen containerimplementaties.

Gebruik de clientbibliotheek voor Azure Container Registry om het volgende te doen:

  • Installatiekopieën of artefacten in een register weergeven
  • Metagegevens verkrijgen voor afbeeldingen en artefacten, opslagplaatsen en tags
  • Eigenschappen voor lezen/schrijven/verwijderen voor registeritems instellen
  • Installatiekopieën en artefacten, opslagplaatsen en tags verwijderen

Broncode | Pakket (Pypi) | Pakket (Conda) | API-referentiedocumentatie | REST API-documentatie | Productdocumentatie

Disclaimer

Ondersteuning voor Azure SDK Python-pakketten voor Python 2.7 is beëindigd op 1 januari 2022. Raadpleeg Python 3.7 of hoger is vereist om https://github.com/Azure/azure-sdk-for-python/issues/20691dit pakket te gebruiken voor meer informatie en vragen. Raadpleeg het ondersteuningsbeleid voor Azure SDK voor Python-versies voor meer informatie.

Aan de slag

Het pakket installeren

Installeer de Azure Container Registry-clientbibliotheek voor Python met pip:

pip install --pre azure-containerregistry

Vereisten

Als u een nieuwe Container Registry wilt maken, kunt u azure portal, Azure PowerShell of de Azure CLI gebruiken. Hier volgt een voorbeeld van het gebruik van de Azure CLI:

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

De client verifiëren

De Azure Identity-bibliotheek biedt eenvoudige Azure Active Directory-ondersteuning voor verificatie. De DefaultAzureCredential gaat ervan uit dat de AZURE_CLIENT_IDomgevingsvariabelen , AZURE_TENANT_IDen AZURE_CLIENT_SECRET zijn ingesteld. Raadpleeg de sectie Omgevingsvariabelen voor Azure Identity voor meer informatie

# 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)

Belangrijkste concepten

In een register worden Docker-installatiekopieën en OCI-artefacten opgeslagen. Een afbeelding of artefact bestaat uit een manifest en lagen. Het manifest van een afbeelding beschrijft de lagen waaruit de afbeelding bestaat en wordt uniek geïdentificeerd door de samenvatting. Een afbeelding kan ook worden 'getagd' om deze een door mensen leesbare alias te geven. Aan een afbeelding of artefact kunnen nul of meer tags zijn gekoppeld en elke tag identificeert de afbeelding uniek. Een verzameling installatiekopieën die dezelfde naam delen, maar verschillende tags hebben, wordt een opslagplaats genoemd.

Zie Container Registry-concepten voor meer informatie.

Voorbeelden

De volgende secties bevatten verschillende codefragmenten voor enkele van de meest voorkomende ACR-servicetaken, waaronder:

Houd er rekening mee dat in elk voorbeeld wordt ervan uitgegaan dat er een CONTAINERREGISTRY_ENDPOINT omgevingsvariabele is ingesteld op een tekenreeks die het https:// voorvoegsel en de naam van de aanmeldingsserver bevat, bijvoorbeeld 'https://myregistry.azurecr.io". Voorbeelden van anonieme toegang krijgen een eindpuntwaarde uit de omgevingsvariabeleCONTAINERREGISTRY_ANONREGISTRY_ENDPOINT.

Opslagplaatsen weergeven

Doorloop de verzameling opslagplaatsen in het register.

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

Tags met anonieme toegang weergeven

Doorloop de verzameling tags in de opslagplaats met anonieme toegang.

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)

Artefacteigenschappen instellen

Eigenschappen van een artefact instellen.

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
    )

Installatiekopieën verwijderen

Verwijder installatiekopieën die ouder zijn dan de eerste drie in de opslagplaats.

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)

Afbeeldingen uploaden

Als u een volledige afbeelding wilt uploaden, moeten we afzonderlijke lagen en configuratie uploaden. Daarna kunnen we een manifest uploaden waarin een afbeelding of artefact wordt beschreven en deze een tag toewijzen.

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

Afbeeldingen downloaden

Als u een volledige installatiekopieën wilt downloaden, moeten we het bijbehorende manifest downloaden en vervolgens afzonderlijke lagen en configuratie downloaden.

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

Manifest verwijderen

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)

Blob verwijderen

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

Problemen oplossen

Raadpleeg de gids voor probleemoplossing voor informatie over het oplossen van problemen.

Algemeen

De ACR-clientbibliotheek genereert uitzonderingen die zijn gedefinieerd in Azure Core.

Logboekregistratie

Deze bibliotheek maakt gebruik van de standaardbibliotheek voor logboekregistratie voor logboekregistratie.

Basisinformatie over HTTP-sessies (URL's, headers, enzovoort) wordt geregistreerd op INFO niveau.

Gedetailleerde DEBUG logboekregistratie op niveau, inclusief aanvraag-/antwoordteksten en niet-bewerkte headers, kan worden ingeschakeld op de client of per bewerking met het logging_enable trefwoordargument.

Bekijk hier de volledige documentatie voor SDK-logboekregistratie met voorbeelden.

Optionele configuratie

Optionele trefwoordargumenten kunnen worden doorgegeven op het niveau van de client en per bewerking. In de naslagdocumentatie van Azure Core worden de beschikbare configuraties beschreven voor nieuwe pogingen, logboekregistratie, transportprotocollen en meer.

Volgende stappen

Bijdragen

Wij verwelkomen bijdragen en suggesties voor dit project. Voor de meeste bijdragen moet u instemmen met een licentieovereenkomst voor bijdragers (CLA: Contributor License Agreement) waarin u verklaart dat u gerechtigd bent ons het recht te geven uw bijdrage te gebruiken, en dat u dit ook doet. Ga naar cla.microsoft.com voor meer informatie.

Op dit project is de Microsoft Open Source Code of Conduct (Microsoft Open Source-gedragscode) van toepassing. Zie de Veelgestelde vragen over de gedragscode voor meer informatie of neem contact op opencode@microsoft.com met eventuele aanvullende vragen of opmerkingen.

Weergaven