Mehrstufiges Dockerimage für .NET
Wofür benötige ich das ?
Die Idee eines Docker-Images ist es ja, das ganze Image nicht all zu weit aufplustern mit Inhalten, die für den Betrieb eigentlich nicht benötigt werden. Also nehmen wir uns ganz einfach gesagt, unseren Code, laden diesen in das erste Docker-Images in dem wir dann alles ganz normal kompilieren und danach nehmen wir den Output des Release-Build und laden diesen in einen weiteren Docker-Container um in diesem dann die Webseite zu betreiben. Dadurch benötigen wir für das eigentliche Image nur die Komponenten des .NET Frameworks, welche wir auch für den Betrieb und nicht nur für die Kompilation benötigen. Also alles etwas kleiner und schlanker. Vorteil: Wir kompilieren unseren Code nicht bei uns auf dem Rechner, sondern in einer immer gleichen Umgebung und können danach unsere Web-App einzeln in einem Docker-Image betreiben.
Wie baue ich eine mehrstufiges Dockerimage für ASP.NET?
Wir gehen erstmal davon aus, dass wir eine .NET-Core WebApp haben und diese per Docker ausrollen möchten. Als erstes müssen wir unseren Code natürlich Builden. Dazu benötigen wir das SDK des Frameworks. Danach Server Build, also in unserem Fall das dotnet/aspnet:5.0 Image welches direkt von Microsoft bereitgestellt wird.
Also bauen wir unser DockerFile wie folgt auf:
- SDK-Image von Microsoft laden
- optional: Workdir setzen
- Sourcen kopieren
- Abhängigkeiten wiederherstellen
- und nun alles kopieren, erstellen und Builden
- Danach nehmen wir uns das Image um ASP NET sourcen laufen zu lassen
- Wechsel des WORKDIR
- Kopieren uns den output des vorherigen Images in unser neues
- Setzen den startpunkt
- Und haben es schon geschafft.
Hier ein Beispiel eines fertigen Dockerfiles:
# https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /source
# copy csproj and restore as distinct layers
COPY *.csproj .
RUN dotnet restore
# copy and publish app and libraries
COPY . .
RUN dotnet restore
RUN dotnet publish -c release -o /app --no-restore
# final stage/image
FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "PROJECTNAME.dll"]
Zusammenfassung
Durch den Einstieg in die mehrstufige DockerFiles erhalten wir diverse Möglichkeiten unsere Web-Apps einfach und schnell zu bauen und zu betreiben. Dies ist natürlich nur ein Beispiel für mehrstufig DockerFiles.