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
- Bu paketi kullanmak için Python 3.7 veya üzeri gereklidir.
- Bu paketi kullanmak için bir Azure aboneliğine ve Container Registry hesabına ihtiyacınız vardır.
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_ID
AZURE_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:
- Kayıt defteri işlemleri:
- Blob ve bildirim işlemleri:
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
- azure.containerregistry ve örneklerimizle daha fazla ilerleyin.
- Bir tanıtım veya ayrıntılı bakış videosu izleyin.
- Azure Container Registry hizmeti hakkında daha fazla bilgi edinin.
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 .
Azure SDK for Python