Neu in .NET 8.0 [38]: Containerdateien per dotnet publish erstellen
Es ist nun möglich, .NET-Anwendungen in eine Containerdatei zu veröffentlichen – ohne Dockerfile und ohne Bereitstellung in Docker.

(Bild: cybrain/Shutterstock.com)
- Dr. Holger Schwichtenberg
Seit .NET 7.0 kann man bereits mit dotnet publish
einen Docker-Container erstellen, ohne dass man dafür zuvor ein Dockerfile (eine zusätzliche Textdatei) bereitstellen muss.
Ein mit .NET 7.0 per Option PublishProfile=DefaultContainer
erstellter Docker-Container wurde automatisch in Docker als aktiver Container bereitgestellt.
In .NET 8.0 gibt dazu noch eine Zusatzoption: -ContainerArchiveOutputPath
. Diese erlaubt es, eine Container-Datei (tar.gz) zu erstellen, ohne sie direkt als aktiven Container bereitzustellen:
dotnet publish -p PublishProfile=DefaultContainer\
-p ContainerArchiveOutputPath=t:\meinblazorimage.tar.gz\
-p:ContainerBaseImage=mcr.microsoft.com/dotnet/aspnet:8.0-alpine
(Bild:Â Dmytro Vikarchuk/Shutterstock)
In der Online-Konferenz betterCode() .NET 9.0 am 19. November 2024 von iX und dpunkt.verlag präsentieren .NET-Experten von www.IT-Visions.de den fertigen Stand von .NET 9.0 anhand von Praxisbeispielen.
Dazu zählen die Neuerungen in .NET 9.0 SDK, C# 13.0, ASP.NET Core 9.0, Blazor 9.0, Windows Forms 9.0, WPF 9.0, WinUI, .NET MAUI 9.0 und die Integration von Künstlicher Intelligenz in .NET-Anwendungen.
Das Programm bietet sechs Vorträge, eine Diskussion und sechs Workshops. Tickets sind bis zum 22. Oktober zum Frühbucherpreis erhältlich.
Folgender Code zeigt das komplette Beispiel:
function New-TempDirectory {
$parent = [System.IO.Path]::GetTempPath()
[string] $name = [System.Guid]::NewGuid()
New-Item -ItemType Directory -Path (Join-Path $parent $name)
}
docker --version
# Tempordner erzeugen und dahin wechseln
New-TempDirectory | cd
# Projekt anlegen (hier: Blazor SSR)
dotnet new blazor -n BlazorImContainer
# In den Ordner wechseln
cd .\BlazorImContainer\
#region Programmcode in Startseite austauschen mit Informationen ĂĽber Umgebung, .NET- und OS-Version sowie Prozess
$indexpage = @'
@page "/"
<PageTitle>Index</PageTitle>
<h1>Liebe Leser*innen,</h1>
<p>diese Blazor Web App (Blazor Static SSR) läuft
@if (System.Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER")=="true")
{ <text><b>im Container </b></text> }
else
{ <text>nicht im Container </text> }!</p>
<p>
.NET-Version: @System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription<br>
Betriebssystem: @System.Runtime.InteropServices.RuntimeInformation.OSDescription<br>
Prozess: @System.Diagnostics.Process.GetCurrentProcess().ProcessName<br>
Prozessidentität: @System.Environment.UserDomainName\@System.Environment.UserName<br>
IsPrivilegedProcess: @System.Environment.IsPrivilegedProcess</p>
<hr>
Umgebungsvariablen:
<ul>
@foreach(System.Collections.DictionaryEntry e in System.Environment.GetEnvironmentVariables())
{
<li>@e.Key: @e.Value</li>
}
</ul>
'@
$indexpage | Set-Content "components/pages/home.razor"
#endregion
# Container-Build-Paket hinzufĂĽgen (neu seit .NET 7.0, wird nicht mehr explizit gebraucht in .NET 8.0!!!)
#dotnet add package Microsoft.NET.Build.Containers --prerelease
# Veröffentlichen als Containerdatei (neu seit .NET 8.0)
dotnet publish -p PublishProfile=DefaultContainer -p ContainerArchiveOutputPath=t:\meinblazorimage.tar.gz -p:ContainerBaseImage=mcr.microsoft.com/dotnet/aspnet:8.0-alpine
# dann irgendwann: Laden in Docker
docker load --input t:\meinblazorimage.tar.gz
# Das ging schon in .NET 7.0
# Veröffentlichen als Container, alle MSBuild-Properties nach PublishProfile=DefaultContainer sind optional
#dotnet publish --os linux --arch x64 -c Release -p:PublishProfile=DefaultContainer -p:ContainerImageName=meinblazorimage #-p:ContainerBaseImage=mcr.microsoft.com/dotnet/aspnet:7.0-alpine
# Start des Containers (in getrennten Prozess, weil sonst dieser hier blockiert ist)
Start-Process powershell { docker run -it --rm -p 5000:8080 blazorimcontainer }
# optionaler Aufruf des Browsers zur Kontrolle
Start-Process "http://localhost:5000"
(rme)