Multi-Stage Docker-Images für .NET + Angular
node_modules in das Image zu packen, das man in Produktion deployt, bedeutet, 800 MB an Werkzeugen auszuliefern, die zur Laufzeit niemals gebraucht werden. Der Multi-Stage-Build trennt, was kompiliert, von dem, was läuft: Man erhält ein winziges finales Image, das nur das enthält, was die Runtime unbedingt benötigt.
Das Prinzip: kompilieren, dann verwerfen
Dockerfile deklariert mehrere FROM -Anweisungen. Jedes FROM öffnet einen isolierten Stage; nur der letzte Stage wird zum ausgelieferten Image. Die Artefakte werden selektiv vom Build-Stage in den Runtime-Stage kopiert — alles andere, SDK, Quellcode, Caches, wird verworfen.
Layer-Cache: Reihenfolge, um nicht alles neu zu bauen
COPY *.csproj gefolgt von dotnet restore bevor der Rest kopiert wird, wird das restore nur bei einer Änderung der .csproj -Datei erneut ausgeführt — nicht bei jeder Änderung einer C#-Datei. Gleiche Logik auf Angular-Seite mit package.json und npm ci vor dem COPY der Quellen: Eine Codeänderung invalidiert niemals die Dependency-Installation, was die Build-Zeiten um das Zehnfache reduziert.
Ein winziges finales Image
aspnet:9.0-noble-chiseled ) entfernen Shell, Paketmanager und überflüssige Binärdateien: reduzierte Angriffsfläche, Images oft unter 110 MB, Ausführung standardmäßig als Non-Root-Benutzer. Für den Angular-Frontend-Service übernimmt nginx alpine die Rolle des finalen Stage.
dist/browser -Ordner wird in das nginx-Root kopiert, und ein try_files $uri /index.html in der Konfiguration sorgt für den SPA-Fallback .
Lokal mit Compose orchestrieren
docker-compose.yml beide Services und ihr Netzwerk:
--target build ) und das Teilen von Stages — nützlich, um einen Testschritt in der CI-Pipeline zu isolieren.
Ein Produktions-Image sollte nur enthalten, was auch ausgeführt wird. Multi-Stage macht diese Disziplin kostenlos: Das SDK bleibt im Build-Stage, niemals in dem, was Sie deployen .