Azure Container Registry klientské knihovny pro Python – verze 1.2.0
Azure Container Registry umožňuje ukládat a spravovat image a artefakty kontejnerů v privátním registru pro všechny typy nasazení kontejnerů.
Pomocí klientské knihovny můžete Azure Container Registry:
- Výpis imagí nebo artefaktů v registru
- Získání metadat pro obrázky a artefakty, úložiště a značky
- Nastavení vlastností pro čtení, zápis nebo odstranění položek registru
- Odstranění obrázků a artefaktů, úložišť a značek
Zdrojový kód | Balíček (Pypi) | Balíček (Conda) | Referenční dokumentace k | rozhraní APIDokumentace k | rozhraní REST APIDokumentace k produktu
Právní omezení
Podpora balíčků Azure SDK Python pro Python 2.7 skončila 1. ledna 2022. Další informace a dotazy najdete v tématu https://github.com/Azure/azure-sdk-for-python/issues/20691Použití tohoto balíčku vyžaduje Python 3.7 nebo novější. Další podrobnosti najdete v tématu Věnovaném zásadám podpory verzí sady Azure SDK pro Python.
Začínáme
Instalace balíčku
Nainstalujte klientskou knihovnu Azure Container Registry pro Python pomocí pipu:
pip install --pre azure-containerregistry
Požadavky
- K použití tohoto balíčku se vyžaduje Python 3.7 nebo novější.
- K použití tohoto balíčku potřebujete předplatné Azure a účet Container Registry .
K vytvoření nového registru kontejneru můžete použít Azure Portal, Azure PowerShell nebo Azure CLI. Tady je příklad použití Azure CLI:
az acr create --name MyContainerRegistry --resource-group MyResourceGroup --location westus --sku Basic
Ověření klienta
Knihovna identit Azure poskytuje snadnou podporu ověřování v Azure Active Directory. Předpokládá DefaultAzureCredential
se, že AZURE_CLIENT_ID
proměnné prostředí , AZURE_TENANT_ID
a AZURE_CLIENT_SECRET
jsou nastavené. Další informace najdete v části Proměnné prostředí identity Azure.
# 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)
Klíčové koncepty
V registru se ukládají image Dockeru a artefakty OCI. Obrázek nebo artefakt se skládá z manifestu a vrstev. Manifest obrázku popisuje vrstvy, které obrázek tvoří, a je jedinečně identifikován jeho souhrnem. Obrázek může být také označený, aby získal alias čitelný pro člověka. K obrázku nebo artefaktu může být přidruženo nula nebo více značek a každá značka jedinečně identifikuje obrázek. Kolekce obrázků, které sdílejí stejný název, ale mají různé značky, se označuje jako úložiště.
Další informace najdete v tématu Koncepty služby Container Registry.
Příklady
Následující části obsahují několik fragmentů kódu, které pokrývají některé z nejběžnějších úloh služby ACR, mezi které patří:
- Operace registru:
- Operace objektů blob a manifestu:
Upozorňujeme, že každá ukázka předpokládá, že existuje CONTAINERREGISTRY_ENDPOINT
proměnná prostředí nastavená na řetězec obsahující předponu https://
a název přihlašovacího serveru, například "https://myregistry.azurecr.io". Ukázky anonymního přístupu získávají hodnotu koncového bodu z proměnnéCONTAINERREGISTRY_ANONREGISTRY_ENDPOINT
prostředí.
Výpis úložišť
Iterujte kolekcí úložišť v registru.
with ContainerRegistryClient(self.endpoint, self.credential) as client:
# Iterate through all the repositories
for repository_name in client.list_repository_names():
print(repository_name)
Výpis značek s anonymním přístupem
Iterujte kolekci značek v úložišti s anonymním přístupem.
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)
Nastavení vlastností artefaktů
Nastavení vlastností artefaktu
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
)
Odstranění imagí
Odstraňte image starší než první tři v úložišti.
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)
Nahrávání obrázků
Pokud chceme nahrát celou image, musíme nahrát jednotlivé vrstvy a konfiguraci. Potom můžeme nahrát manifest, který popisuje obrázek nebo artefakt, a přiřadit mu značku.
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}")
Stažení obrázků
Pokud si chceme stáhnout celou image, musíme stáhnout její manifest a pak stáhnout jednotlivé vrstvy a konfiguraci.
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}")
Odstranění manifestu
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)
Odstranění objektu 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"])
Poradce při potížích
Informace o řešení potíží najdete v průvodci odstraňováním potíží.
Obecné
Klientská knihovna ACR vyvolá výjimky definované v Azure Core.
protokolování
Tato knihovna používá pro protokolování standardní knihovnu protokolování .
Základní informace o relacích HTTP (adresy URL, hlavičky atd.) se protokolují na INFO
úrovni.
Protokolování podrobných DEBUG
úrovní, včetně těl požadavků/odpovědí a nereagovaných hlaviček, je možné povolit u klienta nebo pro jednotlivé operace pomocí argumentu klíčového logging_enable
slova.
Kompletní dokumentaci k protokolování sady SDK s příklady najdete tady.
Volitelná konfigurace
Volitelné argumenty klíčových slov je možné předat na úrovni klienta a na úrovni jednotlivých operací. Referenční dokumentace azure-core popisuje dostupné konfigurace pro opakování, protokolování, přenosové protokoly a další.
Další kroky
- Pokračujte s azure.containerregistry a našimi ukázkami.
- Podívejte se na ukázku nebo podrobné video.
- Přečtěte si další informace o službě Azure Container Registry.
Přispívání
Tento projekt vítá příspěvky a návrhy. Většina příspěvků vyžaduje souhlas s licenční smlouvou s přispěvatelem (CLA), která stanoví, že máte právo udělit nám práva k používání vašeho příspěvku a skutečně tak činíte. Podrobnosti najdete na cla.microsoft.com.
Tento projekt přijal pravidla chování pro Microsoft Open Source. Další informace najdete v nejčastějších dotazech k pravidlům chování nebo se obraťte na opencode@microsoft.com případné další dotazy nebo komentáře.
Azure SDK for Python