Azure Container Registry pustaka klien untuk Python - versi 1.2.0

Azure Container Registry memungkinkan Anda menyimpan dan mengelola gambar kontainer dan artefak dalam registri privat untuk semua jenis penyebaran kontainer.

Gunakan pustaka klien untuk Azure Container Registry untuk:

  • Membuat daftar citra atau artefak dalam registri
  • Mendapatkan metadata untuk gambar dan artefak, repositori, dan tag
  • Mengatur properti baca/tulis/hapus pada item registri
  • Menghapus gambar dan artefak, repositori, dan tag

Kode sumber | Paket (Pypi) | Paket (Conda) | Dokumentasi | referensi APIDokumentasi | REST APIDokumentasi produk

Pengelakan

Dukungan paket Azure SDK Python untuk Python 2.7 telah berakhir 01 Januari 2022. Untuk informasi dan pertanyaan lebih lanjut, silakan merujuk ke https://github.com/Azure/azure-sdk-for-python/issues/20691Python 3.7 atau yang lebih baru diperlukan untuk menggunakan paket ini. Untuk detail selengkapnya, silakan lihat kebijakan dukungan versi Azure SDK for Python.

Memulai

Instal paketnya

Pasang pustaka klien Azure Container Registry untuk Python dengan pip:

pip install --pre azure-containerregistry

Prasyarat

Untuk membuat Container Registry baru, Anda dapat menggunakan Portal Microsoft Azure, Azure PowerShell, atau Azure CLI. Berikut adalah contoh menggunakan SDK:

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

Mengautentikasi klien

Pustaka Azure Identity menyediakan dukungan Azure Active Directory yang mudah untuk autentikasi. DefaultAzureCredential mengasumsikan AZURE_CLIENT_IDvariabel lingkungan , AZURE_TENANT_ID, dan AZURE_CLIENT_SECRET diatur, untuk informasi selengkapnya, lihat bagian variabel lingkungan Azure Identity

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

Konsep utama

Registri menyimpan gambar Docker dan Artefak OCI. Citra atau artefak terdiri dari manifes dan lapisan. Manifes gambar menjelaskan lapisan yang membentuk gambar, dan diidentifikasi secara unik oleh hashnya. Gambar juga dapat "ditandai" untuk memberinya alias yang dapat dibaca manusia. Gambar atau artefak dapat memiliki nol atau lebih tag yang terkait dengannya, dan setiap tag secara unik mengidentifikasi gambar. Kumpulan gambar yang memiliki nama yang sama tetapi memiliki tag yang berbeda, disebut sebagai repositori.

Untuk informasi selengkapnya, silakan lihat Konsep Container Registry.

Contoh

Bagian berikut menyediakan beberapa cuplikan kode yang mencakup beberapa tugas Layanan ACR yang paling umum, termasuk:

Harap dicatat bahwa setiap sampel mengasumsikan ada variabel lingkungan yang CONTAINERREGISTRY_ENDPOINT diatur ke string yang berisi awalan https:// dan nama server login, misalnya "https://myregistry.azurecr.io". Sampel akses anonim mendapatkan nilai titik akhir dari variabelCONTAINERREGISTRY_ANONREGISTRY_ENDPOINT lingkungan.

Daftar repositori

Lakukan iterasi melalui kumpulan repositori dalam registri.

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

Mencantumkan tag dengan akses anonim

Iterasi melalui kumpulan tag di repositori dengan akses anonim.

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)

Mengatur properti artefak

Mengatur properti artefak.

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
    )

Hapus gambar

Hapus gambar yang lebih lama dari tiga gambar pertama di repositori.

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)

Unggah gambar

Untuk mengunggah gambar lengkap, kita perlu mengunggah lapisan dan konfigurasi individual. Setelah itu kita dapat mengunggah manifes yang menjelaskan gambar atau artefak dan menetapkannya tag.

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

Mengunduh gambar

Untuk mengunduh gambar lengkap, kita perlu mengunduh manifesnya dan kemudian mengunduh lapisan dan konfigurasi individual.

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

Hapus manifes

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)

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

Pemecahan Masalah

Untuk informasi tentang pemecahan masalah, lihat panduan pemecahan masalah.

Umum

Pustaka klien ACR akan memunculkan pengecualian yang ditentukan dalam Azure Core.

Pembuatan Log

Pustaka ini menggunakan pustaka pengelogan standar untuk pengelogan.

Informasi dasar tentang sesi HTTP (URL, header, dll.) dicatat pada INFO tingkat.

Pengelogan tingkat terperinci DEBUG , termasuk isi permintaan/respons dan header yang tidak diredaktifkan , dapat diaktifkan pada klien atau per operasi dengan logging_enable argumen kata kunci.

Lihat dokumentasi pengelogan SDK lengkap dengan contoh di sini.

Konfigurasi Opsional

Argumen kata kunci opsional dapat diteruskan di tingkat klien dan per operasi. Dokumentasi referensi azure-core menjelaskan konfigurasi yang tersedia untuk percobaan ulang, pengelogan, protokol transportasi, dan banyak lagi.

Langkah berikutnya

Berkontribusi

Proyek ini menyambut baik kontribusi dan saran. Sebagian besar kontribusi mengharuskan Anda menyetujui Perjanjian Lisensi Kontributor (CLA) yang menyatakan bahwa Anda memiliki hak untuk, dan benar-benar melakukannya, memberi kami hak untuk menggunakan kontribusi Anda. Untuk detailnya, kunjungi cla.microsoft.com.

Proyek ini telah mengadopsi Kode Etik Sumber Terbuka Microsoft. Untuk informasi selengkapnya, lihat Tanya Jawab Umum Tata Tertib atau hubungi opencode@microsoft.com untuk pertanyaan atau komentar lainnya.

Tayangan