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
- Python 3.7 atau yang lebih baru diharuskan untuk menggunakan paket ini.
- Anda memerlukan langganan Azure dan akun Container Registry untuk menggunakan paket ini.
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_ID
variabel 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:
- Operasi registri:
- Operasi blob dan manifes:
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
- Lanjutkan dengan azure.containerregistry dan sampel kami.
- Tonton demo atau video mendalam.
- Baca selengkapnya tentang layanan Azure Container Registry.
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.
Azure SDK for Python