Ich habe kürzlich über die Optimierung der Größe von .NET- und ASP.NET-Docker-Dateien gebloggt. .NET Core 2.0 wurde zuvor auf einem Debian-Image erstellt, aber heute gibt es ein Vorschau-Image mit .NET Core 2.1 Nightlies unter Verwendung von Alpine. Die Ankündigung zu diesem neuen Alpine-Vorschaubild können Sie hier nachlesen. Es gibt auch einen guten Rollup-Beitrag zu .NET und Docker.
Sie haben zwei neue Bilder hinzugefügt:
2.1-runtime-alpine
2.1-runtime-deps-alpine
Die Alpine-Unterstützung ist Teil der .NET Core 2.1-Version. .NET Core 2.1-Images werden derzeit im Microsoft/dotnet-nightly-Repository bereitgestellt, einschließlich der neuen Alpine-Images. .NET Core 2.1-Images werden nach der Veröffentlichung im Jahr 2018 in das Microsoft/dotnet-Repo hochgestuft.
HINWEIS:Das Image -runtime-deps- enthält die Abhängigkeiten, die für eine .NET Core-Anwendung benötigt werden, aber NICHT die .NET Core-Laufzeit selbst. Dies ist das Image, das Sie verwenden würden, wenn Ihre App eine eigenständige Anwendung wäre, die eine Kopie der .NET Core-Runtime enthält. Dies sind Apps, die mit -r [Laufzeit-ID] veröffentlicht wurden. Die meisten Benutzer verwenden das Runtime-Image, das die vollständige .NET Core-Runtime enthält. Um es klar zu sagen:
- Die
runtime
image enthält die .NET Core-Runtime und soll Framework-abhängige bereitgestellte Anwendungen ausführen – siehe Beispiel- Die
runtime-deps
image enthält nur die nativen Abhängigkeiten, die von .NET Core benötigt werden, und soll eigenständig bereitgestellte Anwendungen ausführen – siehe Beispiel
Es ist am besten, mit .NET Core mehrstufige Builddateien zu verwenden, sodass Sie einen Container haben, der Ihre App erstellt, und einen, der die Ergebnisse dieses Builds enthält. Auf diese Weise versenden Sie kein Image mit einer Reihe von SDKs und Compilern, die Sie nicht benötigen.
HINWEIS:Lesen Sie dies, um mehr über Image-Versionen in Dockerfiles zu erfahren, damit Sie das richtige Tag und Digest für Ihre Anforderungen auswählen können. Idealerweise wählen Sie eine Docker-Datei aus, die aktualisiert wird, um die neuesten Wartungspatches einzuschließen.
Ausgehend von dieser Docker-Datei bauen wir mit dem SDK-Image, veröffentlichen es dann und das Ergebnis beträgt etwa 219 MB.
FROM microsoft/dotnet:2.0-sdk as builder
RUN mkdir -p /root/src/app/dockertest
WORKDIR /root/src/app/dockertest
COPY dockertest.csproj .
RUN dotnet restore ./dockertest.csproj
COPY . .
RUN dotnet publish -c release -o published
FROM microsoft/dotnet:2.0.0-runtime
WORKDIR /root/
COPY --from=builder /root/src/app/dockertest/published .
ENV ASPNETCORE_URLS=http://+:5000
EXPOSE 5000/tcp
CMD ["dotnet", "./dockertest.dll"]
Dann speichere ich dies als Dockerfile.debian und baue so:
> docker build . -t shanselman/dockertestdeb:0.1 -f dockerfile.debian
Bei einer standardmäßigen ASP.NET-App ist dieses Bild am Ende 219 MB groß.
Jetzt ändere ich nur eine Zeile und verwende die 2.1 alpine Runtime
FROM microsoft/dotnet-nightly:2.1-runtime-alpine
Und so bauen:
> docker build . -t shanselman/dockertestalp:0.1 -f dockerfile.alpine
und vergleiche die beiden:
> docker images | find /i "dockertest"
shanselman/dockertestalp 0.1 3f2595a6833d 16 minutes ago 82.8MB
shanselman/dockertestdeb 0.1 0d62455c4944 30 minutes ago 219MB
Nett. Etwa 83 MB statt 219 MB für eine Hello-World-Web-App. Nun die Idee eines Mikro Service ist machbarer!
Bitte besuchen Sie das GitHub-Problem hier https://github.com/dotnet/dotnet-docker-nightly/issues/500 und teilen Sie Ihre Gedanken und Ergebnisse mit, während Sie diese Alpine-Bilder testen. Sind Sie auch an einem "-debian-slim" interessiert? Es wäre auf halbem Weg zu Alpine, aber nicht so schwer wie nur -debian.
Es passieren viele tolle Dinge rund um .NET und Docker. Sehen Sie sich unbedingt auch den Beitrag von Jeff Fritz zum Erstellen eines minimalen ASP.NET Core-Windows-Containers an, um zu sehen, wie Sie (vollständige) Framework-Anwendungen, die auch auf Windows-Containern ausgeführt werden, zerquetschen können. Beispielsweise sind die Windows Nano Server-Images nur 93 MB komprimiert .
Sponsor: Holen Sie sich die neueste JetBrains Rider-Vorschau für .NET Core 2.0-Unterstützung, Wertverfolgung und Aufrufverfolgung, MSTest-Runner, neue Codeinspektionen und Refactorings sowie die Parallel Stacks-Ansicht im Debugger.