Share via


Python için Azure Container Registry istemci kitaplığı - sürüm 1.2.0

Azure Container Registry, kapsayıcı görüntülerini ve yapıtlarını her tür kapsayıcı dağıtımı için özel bir kayıt defterinde depolamanıza ve yönetmenize olanak tanır.

Azure Container Registry için istemci kitaplığını kullanın:

  • Kayıt defterindeki görüntüleri veya yapıtları listeleme
  • Görüntüler ve yapıtlar, depolar ve etiketler için meta verileri alma
  • Kayıt defteri öğelerinde okuma/yazma/silme özelliklerini ayarlama
  • Görüntüleri ve yapıtları, depoları ve etiketleri silme

Kaynak kodu | Paket (Pypi) | Paket (Conda) | API başvuru belgeleri | REST API belgeleri | Ürün belgeleri

Bildirim

Python 2.7 için Azure SDK Python paketleri desteği 01 Ocak 2022'de sona erdi. Daha fazla bilgi ve soru için lütfen bu paketi kullanmak için https://github.com/Azure/azure-sdk-for-python/issues/20691Python 3.7 veya üzeri gereklidir konusuna bakın. Daha fazla ayrıntı için bkz. Python için Azure SDK sürüm desteği ilkesi.

Başlarken

Paketi yükleme

Pip ile Python için Azure Container Registry istemci kitaplığını yükleyin:

pip install --pre azure-containerregistry

Önkoşullar

Yeni bir Container Registry oluşturmak için Azure Portalı, Azure PowerShell veya Azure CLI'yı kullanabilirsiniz. Azure CLI'yi kullanan bir örnek aşağıda verilmiştir:

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

İstemcinin kimliğini doğrulama

Azure Kimlik kitaplığı, kimlik doğrulaması için kolay Azure Active Directory desteği sağlar. DefaultAzureCredential, ve AZURE_TENANT_IDAZURE_CLIENT_SECRET ortam değişkenlerinin ayarlandığını varsayarAZURE_CLIENT_ID. Daha fazla bilgi için Azure Kimlik ortam değişkenleri bölümüne bakın

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

Önemli kavramlar

Kayıt defteri Docker görüntülerini ve OCI Yapıtlarını depolar. Görüntü veya yapıt bir bildirimden ve katmanlardan oluşur. Görüntünün bildirimi, görüntüyü oluşturan katmanları açıklar ve özetiyle benzersiz bir şekilde tanımlanır. Bir görüntü, insan tarafından okunabilen bir diğer ad vermek için "etiketlenebilir" de olabilir. Bir görüntü veya yapıtla ilişkilendirilmiş sıfır veya daha fazla etiket olabilir ve her etiket görüntüyü benzersiz olarak tanımlar. Aynı adı paylaşan ancak farklı etiketlere sahip olan görüntü koleksiyonuna depo adı verilir.

Daha fazla bilgi için bkz. Container Registry Kavramları.

Örnekler

Aşağıdaki bölümlerde, aşağıdakiler dahil olmak üzere en yaygın ACR Hizmeti görevlerinden bazılarını kapsayan çeşitli kod parçacıkları sağlanır:

Her örneğin ön ekini ve oturum açma sunucusunun adını içeren https:// bir dizeye ayarlanmış bir CONTAINERREGISTRY_ENDPOINT ortam değişkeni olduğunu varsadığını lütfen unutmayın; örneğin, "https://myregistry.azurecr.io". Anonim erişim örnekleri ortam değişkenindenCONTAINERREGISTRY_ANONREGISTRY_ENDPOINT uç nokta değeri alıyor.

Depoları listeleme

Kayıt defterindeki depoların koleksiyonunda yineleme yapın.

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

Anonim erişimli etiketleri listeleme

Anonim erişimle depodaki etiket koleksiyonunda yineleme yapın.

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)

Yapıt özelliklerini ayarlama

Yapıtın özelliklerini ayarlama.

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
    )

Görüntüleri silme

Depodaki ilk üçten eski görüntüleri silin.

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)

Görüntüleri karşıya yükleme

Tam bir görüntüyü karşıya yüklemek için tek tek katmanları ve yapılandırmayı karşıya yüklememiz gerekir. Bundan sonra bir görüntüyü veya yapıtı açıklayan bir bildirimi karşıya yükleyebilir ve bir etiket atayabiliriz.

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

Görüntüleri indirme

Tam bir görüntü indirmek için bildirimini indirmemiz ve ardından tek tek katmanları ve yapılandırmaları indirmemiz gerekir.

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

Bildirimi silme

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)

Blobu silme

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

Sorun giderme

Sorun giderme hakkında bilgi için sorun giderme kılavuzuna bakın.

Genel

ACR istemci kitaplığı , Azure Core'da tanımlanan özel durumları tetikler.

Günlüğe Kaydetme

Bu kitaplık , günlüğe kaydetme için standart günlük kitaplığını kullanır.

HTTP oturumlarıyla ilgili temel bilgiler (URL'ler, üst bilgiler vb.) düzeyinde INFO günlüğe kaydedilir.

İstek/yanıt gövdeleri ve kaydedilmemiş üst bilgiler de dahil olmak üzere ayrıntılı DEBUG düzey günlüğe kaydetme, istemcide veya anahtar sözcük bağımsız değişkeniyle logging_enable işlem başına etkinleştirilebilir.

Burada örneklerin bulunduğu tam SDK günlük belgelerine bakın.

İsteğe Bağlı Yapılandırma

İsteğe bağlı anahtar sözcük bağımsız değişkenleri istemci ve işlem başına düzeyinde geçirilebilir. Azure-core başvuru belgelerinde yeniden denemeler, günlüğe kaydetme, aktarım protokolleri ve daha fazlası için kullanılabilir yapılandırmalar açıklanmaktadır.

Sonraki adımlar

Katkıda bulunma

Bu proje, katkı ve önerilere açıktır. Çoğu durumda, sağladığınız katkıyı kullanmamız için bize hak tanıma hakkına sahip olduğunuzu ve bu hakkı bize tanıdığınızı bildiren bir Katkıda Bulunan Lisans Sözleşmesi’ni (CLA) kabul etmeniz gerekir. Ayrıntılar için cla.microsoft.com adresini ziyaret edin.

Bu proje Microsoft Open Source Code of Conduct (Microsoft Açık Kaynak Kullanım Kuralları) belgesinde listelenen kurallara uygundur. Daha fazla bilgi için Kullanım Kuralları SSS bölümüne bakın veya ek sorularınız veya yorumlarınızla iletişime geçin opencode@microsoft.com .

İzlenimler