Was wo läuft
| Azure-Dienst | Lokale Entsprechung | Dein lokaler Workflow |
|---|---|---|
| Container Apps | Docker Compose mit den Images der App | Services gemeinsam mit Healthchecks und veröffentlichten Ports ausführen |
| Blob Storage | Azurite | Lokalen Blob Storage auf Port 10000 verwenden |
| Azure Functions (Container) | Functions-Basisimage | Das amd64-Functions-Image über Rosetta ausführen |
| AKS | kubectl und k9s mit AKS; kwok für eine lokale API | Lokal bauen und testen, dann kubectl und k9s mit deinem Cluster verwenden |
Container Apps: Die Container testen, nicht einen Simulator
Eine Container App führt einen oder mehrere Container mit Umgebungsvariablen, Geheimnissen, einem Ingress-Port, Zustandsprüfungen und Skalierungsregeln aus. Die Container sind der Teil, in dem Fehler auftreten, und sie verhalten sich auf deinem Mac wie in Azure, wenn du dasselbe Image ausführst. Skalierungsregeln, Revisionen und verwaltete Identitäten bleiben in Azure; alles innerhalb des Containers kannst du lokal testen.
Die Container einer Azure Container App lokal mit Compose und Azurite ausführen
- Beschreibe die App in Compose. Schreibe einen Compose-Service pro Container deiner Container App (Hauptcontainer und alle Sidecars), mit denselben Images, Umgebungsvariablen, Ingress-Port und Zustandsprüfungen.
- Füge Azurite für den Speicher hinzu. Füge einen Service auf Basis von
mcr.microsoft.com/azure-storage/azuritehinzu, der die Ports 10000 (Blob), 10001 (Queue) und 10002 (Table) veröffentlicht, und richte die Speicher-Verbindungszeichenfolge der App darauf aus. - Lege bei Bedarf amd64 fest. Setze
platform: linux/amd64bei jedem Service, dessen Image keinen arm64-Build hat, etwa den Basisimages von Azure Functions. Es läuft über Rosetta. - Starte und warte. Führe
docker compose up -d --waitaus. Der Befehl kehrt zurück, wenn jeder Service mit Healthcheck gesund ist. - Teste und pushe dann. Rufe die App auf
localhostauf. Wenn sie funktioniert, melde dich mitaz acr login --name REGISTRYan, vergib einen Tag für das Image und pushe es mitdocker pushfür Container Apps oder AKS.
services:
web:
image: myregistry.azurecr.io/web:2.1.0
environment:
AZURE_STORAGE_CONNECTION_STRING: >-
DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=REPLACE_WITH_AZURITE_DEV_KEY;BlobEndpoint=http://azurite:10000/devstoreaccount1;
ports: ["8080:8080"]
depends_on: [azurite]
azurite:
image: mcr.microsoft.com/azure-storage/azurite
ports: ["10000:10000", "10001:10001", "10002:10002"] Azurites allgemein bekannter Kontoschlüssel für die Entwicklung steht in Microsofts Azurite-Dokumentation; kopiere ihn von dort. Innerhalb des Compose-Netzwerks erreicht die App Azurite über den Servicenamen (azurite:10000), von deinem Mac aus über localhost:10000.
Azurite auf Oxcart
Azurite ist Microsofts quelloffener Azure-Storage-Emulator mit Blob, Queue und Table (Table als Vorschau) auf den Ports 10000 bis 10002. Wir haben den Blob-Dienst gestartet und vom Mac aus aufgerufen:
docker run -d -p 10000:10000 mcr.microsoft.com/azure-storage/azurite \
azurite-blob --blobHost 0.0.0.0
curl -i "http://127.0.0.1:10000/devstoreaccount1?comp=list"
# 403 AuthorizationFailure, Server: Azurite-Blob/3.37.0 (expected for an unsigned request) 403 ist die richtige Antwort auf eine Anfrage ohne Signatur: Der Endpunkt läuft und ist erreichbar. Dein SDK signiert seine Anfragen mit der Entwicklungs-Verbindungszeichenfolge.
Azure Functions in einem Container
Die von uns getesteten Azure-Functions-Basisimages bieten nur einen amd64-Build. Ein gewöhnlicher Build auf einem Mac mit Apple-Chip scheitert daher mit „no match for platform in manifest“. Baue und starte sie als linux/amd64; Oxcart führt sie über Rosetta aus:
# Dockerfile
FROM mcr.microsoft.com/azure-functions/python:4-python3.12
ENV AzureWebJobsScriptRoot=/home/site/wwwroot \
AzureFunctionsJobHost__Logging__Console__IsEnabled=true \
AzureWebJobsFeatureFlags=EnableWorkerIndexing
COPY . /home/site/wwwroot
docker build --platform linux/amd64 -t my-func .
docker run -d --platform linux/amd64 -p 7071:80 my-func
curl localhost:7071/api/hello In unserem Durchlauf antwortete eine per HTTP ausgelöste Funktion von x86_64 etwa 13 Sekunden nach docker run. Das Log des Functions-Hosts zeigte die zugeordnete Route und den erfolgreichen Aufruf. Übergib --platform linux/amd64 auch an docker run: Ein lokal gebautes, nur für amd64 verfügbares Image wird nur gefunden, wenn die Plattform angegeben ist. Azure Functions Core Tools kann dasselbe Image anschließend mit func azurecontainerapps deploy oder func kubernetes deploy bereitstellen.
Nach Azure Container Registry pushen
az acr login --name myregistry
docker buildx build --platform linux/amd64 --load -t myregistry.azurecr.io/web:2.1.0 .
docker push myregistry.azurecr.io/web:2.1.0 Baue für die Architektur deiner Container-Apps-Umgebung oder deines AKS-Node-Pools. Das Pushen eines Images für mehrere Plattformen aus Oxcart wird nicht unterstützt. Pushe daher einen Tag pro Architektur oder veröffentliche Manifeste für mehrere Architekturen aus CI.
AKS von deinem Mac aus
az aks get-credentials --resource-group RG --name CLUSTER fügt AKS deiner kubeconfig hinzu, damit du kubectl und k9s von macOS aus verwenden kannst. Entwickle deine Services lokal mit Oxcart und stelle dieselben Images auf AKS bereit. Für lokale API- und Controller-Tests läuft kwok auf Oxcart mit einer echten Control Plane und simulierten Nodes. Diese Workflows findest du in der Anleitung zu Kubernetes auf dem Mac.
Warum Oxcart dafür nutzen
Lokale Tests lohnen sich nur, wenn der Zyklus kurz ist. Oxcart erreichte 42 ms für docker run --rm und 77 ms zum Stoppen und Entfernen von 20 Containern, am schnellsten unter den drei getesteten Laufzeitumgebungen. Ausgehende Verbindungen von Containern werden von deinem Mac geöffnet. Ein VPN oder eine Route zu einem privaten Endpunkt in deinem Azure-Netzwerk gilt daher ebenfalls für sie. Siehe Containernetzwerke auf dem Mac.
Fragen
Gibt es einen lokalen Emulator für Azure Container Apps?
Mit Stand Oktober 2026 haben wir in Microsofts Dokumentation keinen offiziellen lokalen Container-Apps-Emulator gefunden. Microsoft verweist auf az containerapp up für Deployments aus lokalem Quellcode und auf Aspire für lokale Orchestrierung. Eine Container App besteht aus mehreren Containern. Die praktische lokale Entsprechung sind daher dieselben Container in einem Compose-Projekt, mit Azurite für den Speicher.
Läuft Azurite auf einem Mac mit Apple-Chip?
Ja. Auf Oxcart startete docker run -d -p 10000:10000 mcr.microsoft.com/azure-storage/azurite azurite-blob --blobHost 0.0.0.0 Azurite 3.37.0, und sein Blob-Endpunkt antwortete auf localhost:10000.
Kann ich Azure Functions in einem Container auf dem Mac ausführen?
Ja, mit --platform linux/amd64. Das von uns getestete Python-Basisimage von Azure Functions (mcr.microsoft.com/azure-functions/python:4-python3.12) hat keinen arm64-Build. Ein gewöhnlicher Build scheitert daher mit „no match for platform in manifest“. Auf Oxcart als linux/amd64 gebaut und gestartet, lief es über Rosetta, und eine per HTTP ausgelöste Funktion antwortete auf localhost.
Wie pushe ich vom Mac nach Azure Container Registry?
Führe az acr login --name REGISTRY aus, dann docker tag und docker push REGISTRY.azurecr.io/app:TAG. Auf Oxcart landen über docker login gespeicherte Zugangsdaten im macOS-Schlüsselbund.
Wie entwickle ich auf meinem Mac für AKS?
Baue und teste deine App und ihre Abhängigkeiten lokal mit Oxcart. Verbinde kubectl und k9s über az aks get-credentials mit AKS und nutze kwok auf Oxcart, um Manifeste gegen eine lokale Kubernetes-API mit simulierten Nodes zu prüfen. Siehe Kubernetes auf dem Mac.
Was ist mit dem Cosmos-DB-Emulator?
Microsoft veröffentlicht ein Linux-basiertes Image des Cosmos-DB-Emulators (vNext, API für NoSQL). Wir haben es nicht auf Oxcart getestet. Probiere es daher während der kostenlosen Testphase mit deinem Projekt aus, bevor du dich darauf verlässt.
Quellen und Methode
- Beispiele getestet mit Oxcart 0.1.2, Mac17,14, macOS 27.2, 2026-10-10 (Azurite 3.37.0 Blob, Python-4-Image von Azure Functions als linux/amd64, Compose).
- Azurite: https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azurite. Azure Functions Core Tools: https://learn.microsoft.com/en-us/azure/azure-functions/functions-run-local. Container Apps (kein lokaler Emulator gefunden): https://learn.microsoft.com/en-us/azure/container-apps/quickstart-code-to-cloud. Cosmos-DB-Emulator für Linux: https://learn.microsoft.com/en-us/azure/cosmos-db/emulator-linux. Geprüft am 2026-10-10.
- Containergeschwindigkeit: Oxcart 0.1.2, 2026-10-10, Apple M5 Max, 8 CPUs und 12 GiB, Mediane aus fünf Messungen; die anderen Laufzeitumgebungen wurden früher am selben Tag auf demselben Mac mit demselben Messaufbau und dem docker-Client 29.4 gemessen.