Eine Anwendung skaliert hoch. Ein neuer Server startet, zieht wie alle anderen inference-api:latest und führt anderen Code aus. Niemand hat etwas deployt: Jemand hat ein neues Image unter demselben Tag gepusht.
Dieses Erklärvideo zeigt, wie Azure Container Registry (ACR) Images speichert, warum ein Tag keine Version ist, wie ACR Tasks Images in der Cloud baut und aktuell hält, und ein Schema für Tags und Aufräumen, mit dem Produktion vorhersagbar bleibt.
Das Wichtigste
- Ein Tag ist ein Etikett, das wandern kann. Ein Digest ist ein Fingerabdruck, der sich nie ändert. Wer einen vorhandenen Tag erneut pusht, verschiebt ihn auf das neue Image; das alte Image bleibt in der Registry, ohne Tag.
- ACR Tasks baut in Azure.
az acr buildlädt den Quellcode hoch, baut das Image und pusht es, ohne Docker auf dem eigenen Rechner. Tasks können außerdem bei einem Commit, nach Zeitplan oder bei einem Patch des Base Images neu bauen. - Stabile Tags für Base Images, eindeutige Tags für Deployments.
latestbleibt aus der Produktion heraus, und das deployte Image wird gesperrt. acr purgelöscht die Tags, die Ihr Filter auswählt, nicht nur Images ohne Tag. Für verwaiste Images allein gibt es--untagged-only, und jeder neue Purge-Befehl läuft zuerst mit--dry-run.
Wie Images gespeichert werden
| Ebene | Was sie enthält | Beispiel |
|---|---|---|
| Registry | alles, hinter einer Adresse: dem Login-Server | myacr.azurecr.io |
| Repository | alle Versionen eines Images; Schrägstriche gruppieren Repositories nach Team oder Umgebung | production/inference-api |
| Artefakt | ein Container-Image, ein Helm-Chart oder ein anderes OCI-Artefakt | inference-api:v1.2.0 |
Berechtigungen lassen sich auf ein Repository oder ein Namespace-Präfix beschränken, sodass ein Team nur seine eigenen Images erreicht.
Ein Image ist ein Stapel aus Layern. Jede Dockerfile-Anweisung, die Dateien ändert, fügt einen hinzu. Layer werden nach ihrem Inhalt gespeichert: Teilen sich zehn Images denselben Python-Base-Layer, speichert die Registry ihn einmal, und ein Server, der ihn schon hat, lädt ihn nicht erneut herunter. Obendrauf liegt das Manifest. Es listet alle Layer auf und wird über einen Digest identifiziert, einen SHA-256-Hash.
Die drei Tarife (Basic, Standard, Premium) pushen und pullen gleich. Premium ergänzt Funktionen für größere Umgebungen, etwa Georeplikation in andere Regionen und Private Endpoints.
Tags und Digests
Ein Tag wie v1.2.0 oder latest ist ein lesbarer Name. Ein Image kann mehrere Tags tragen, zum Beispiel 1.2.0 und stable. Aber ein Tag kann wandern: Wird ein neues Image mit einem vorhandenen Tag gepusht, springt der Tag auf das neue Image. Genau das ist dem neuen Server oben passiert. Und fehlt der Tag ganz, nimmt Docker latest.
Ein Digest wird aus dem Inhalt berechnet und kann deshalb nie auf ein anderes Image zeigen:
# Per Tag: worauf der Tag gerade zeigtdocker pull myacr.azurecr.io/inference-api:v1.2.0# Per Digest: immer genau dieses Imagedocker pull myacr.azurecr.io/inference-api@sha256:<digest>
Tags sind für Menschen. Digests sind für Garantien.
Builds in der Cloud mit ACR Tasks
Lokal bauen und pushen funktioniert, bis fünf Entwickler dasselbe Image auf fünf Laptops bauen. Ein Quick Task verlegt den Build nach Azure:
az acr build --registry myacr \--image inference-api:v1.0.0 .
Das letzte Argument ist der Build-Kontext: ein lokaler Ordner, ein Git-Repository oder ein Remote-Tarball. Der Befehl lädt ihn hoch, führt den Docker-Build in Azure aus und pusht das Ergebnis, wie docker build plus docker push. Jeder Build läuft in derselben Umgebung, und ACR Tasks baut Images für Linux, Windows und ARM.
Ein schneller Smoke-Test startet einen Container aus der Registry in der Cloud und zeigt seine Ausgabe:
az acr run --registry myacr \--cmd '$Registry/inference-api:v1.0.0 python --version' \/dev/null
/dev/null heißt „kein Quellkontext“. $Registry steht für Ihre Registry; ohne sie würde der Image-Name auf Docker Hub gesucht.
Builds, die von selbst starten
Ein mit az acr task create angelegter Task kann von selbst starten:
| Trigger | Startet einen Build, wenn | Gut zu wissen |
|---|---|---|
| Quellcode | ein Commit in einem GitHub- oder Azure-DevOps-Repository ankommt | Builds für Pull Requests sind möglich, standardmäßig aus |
| Timer | ein Cron-Ausdruck zutrifft | der Zeitplan ist in UTC |
| Base Image | das Base Image Ihrer Anwendung aktualisiert wird | standardmäßig an; der Task lernt das Base Image beim ersten Lauf |
az acr task create --registry myacr --name build-api \--image 'inference-api:{{.Run.ID}}' \--context https://github.com/org/api.git#main \--file Dockerfile --git-access-token $PAT \--schedule "0 0 * * *"
Der Base-Image-Trigger spart die meiste Arbeit. Bekommt python:3.12-slim einen Sicherheitspatch, ist jedes darauf gebaute Image veraltet; ACR Tasks baut sie automatisch neu. Das funktioniert mit Base Images in derselben Registry, in einer anderen Azure Container Registry oder in öffentlichen Repositories auf Docker Hub und in der Microsoft Container Registry. Ein Base Image in einer Azure-Registry löst den Rebuild sofort aus; öffentliche Base Images werden alle 10 bis 60 Minuten geprüft. Verfolgt wird nur das Base Image der letzten Stage.
Eine Bedingung: Das Base Image muss einen stabilen Tag behalten, etwa 3.12-slim. Kommt der Patch unter einem neuen Tag, wird nichts ausgelöst.
Für mehrere Schritte wird ein Task in YAML beschrieben. Dieser baut das Image, führt darin die Tests aus und pusht erst am Ende:
version: v1.1.0steps:- build: -t $Registry/inference-api:$ID .- cmd: $Registry/inference-api:$ID python -m pytest- push:- $Registry/inference-api:$ID
Die Schritte laufen nacheinander, und ein fehlgeschlagener Schritt lässt den ganzen Lauf scheitern. Ein Image mit roten Tests wird also nie gepusht. $ID ist die Run-ID: Jeder Build bekommt seinen eigenen, eindeutigen Tag.
Tags für die Produktion
| Stabile Tags | Eindeutige Tags | |
|---|---|---|
| Wiederverwendet? | ja, sie wandern zu jeder neuen Version | nie |
| Beispiele | 1 (neueste 1.x), 1.1 (neuester Patch von 1.1) | Build-ID, Zeitstempel, Commit-Hash |
| Richtig für | Base Images: Patches fließen ein | Deployments: Jeder Server zieht dasselbe Image, ein Rollback ist der vorherige Tag |
Die Build-ID ist meist der beste eindeutige Tag, denn sie führt direkt zum Pipeline-Lauf mit Logs und Testergebnissen. Ein Commit-Hash kann sich wiederholen: Ein Rebuild wegen des Base Images nutzt denselben Commit.
Die Regel: stabile Tags für Base Images, eindeutige Tags für Deployments, und latest bleibt aus der Produktion heraus.
Danach schützen Sie, was läuft. Ein gesperrtes Image lässt sich nicht versehentlich überschreiben oder löschen, bis es wieder entsperrt wird:
az acr repository update --name myacr \--image inference-api:v1.2.0 --write-enabled false
Aufräumen, ohne die Produktion zu löschen
Jeder verschobene Tag hinterlässt ein Image ohne Tag, und mit der Zeit füllen diese verwaisten Images die Registry und die Rechnung. Das Werkzeug zum Aufräumen ist acr purge (in Preview). Es läuft als Task in der Registry, bei Bedarf oder nach Zeitplan.
Der häufige Fehler: Der Filter wählt Tags aus. Purge löscht jeden passenden Tag, der älter ist als --ago, und --untagged entfernt zusätzlich die Images ohne Tag. --filter 'inference-api:.*' --untagged --ago 30d löscht also jeden Tag in diesem Repository, der älter als 30 Tage ist, auch den in Produktion, sofern er nicht gesperrt ist.
Nur die verwaisten Images, und zuerst als Vorschau:
az acr run --registry myacr \--cmd "acr purge --untagged-only --ago 7d --dry-run" \/dev/null
Im Premium-Tarif löscht eine Aufbewahrungsrichtlinie (Retention Policy) Images ohne Tag automatisch nach einer festgelegten Zahl von Tagen (noch in Preview). Eine Warnung für beides: Ein System, das per Digest zieht, braucht womöglich ein Image ohne Tag, und das Aufräumen löscht Images ohne Tag. Eindeutige Tags vermeiden das Problem.

