Neu in .NET 7.0 [15]: Docker-Deployment mit .NET CLI ohne Dockerfile
Ein neues NuGet-Paket kümmert sich um die passende Docker-Konfiguration für containerisierte .NET-Anwendungen.
- Dr. Holger Schwichtenberg
Wer den Aufwand vermeiden möchte, ein richtig konfiguriertes Dockerfile zu schreiben, kann in .NET 7.0 Docker-Container direkt per .NET CLI (dotnet/dotnet.exe) erstellen.
Dazu hat Microsoft das neue NuGet-Paket Microsoft.NET.Build.Containers veröffentlicht, das man in Verbindung mit dem bestehenden .NET CLI-Befehl dotnet publish
verwenden kann.
Folgendes PowerShell-Skript mit .NET CLI-Befehlen zeigt die Abfolge der wenigen Kommandozeilenbefehle vom Anlegen eines neuen .NET-Projekts (in diesem Fall eine Blazor Server-Anwendung) und Veränderung des Codes in der Startseite (um zu beweisen, dass die Anwendung wirklich im Container läuft) über das Docker-Deployment bis zum Aufruf des im Linux-Container laufenden Webservers plus Start des Browsers.
# Projekt anlegen (hier: ASP.NET Core Blazor Server)
dotnet new blazorserver -n BSContainer
# In den Ordner wechseln
cd .\BSContainer\
# Programmcode in Startseite austauschen mit Informationen über
# Umgebung, .NET- und OS-Version sowie Prozess
$indexpage = @'
@page "/"
<PageTitle>Index</PageTitle>
<h1>Hallo iX-Leser*in,</h1>
<p>diese Blazor Server App läuft
@if (System.Environment.GetEnvironmentVariable
("DOTNET_RUNNING_IN_CONTAINER")=="true")
{ <text><b>im Container </b></text> }
else
{ <text>nicht im Container </text> }
mit
@System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription
auf @System.Runtime.InteropServices.RuntimeInformation.OSDescription!
</p>
<p>Prozess:
@System.Diagnostics.Process.GetCurrentProcess().ProcessName<br>
Prozessidentität:
@System.Environment.UserDomainName\@System.Environment.UserName</p>
'@
$indexpage | Set-Content "pages/index.razor"
# Container-Build-Paket hinzufügen
dotnet add package Microsoft.NET.Build.Containers
# Veröffentlichen als Container
dotnet publish --os linux --arch x64 -c Release\
-p:PublishProfile=DefaultContainer
# Start des Containers (in getrennten Prozess,
# weil sonst dieser hier blockiert ist)
Start-Process powershell {
docker run -it --rm -p 5000:80 bscontainer:1.0.0 }
# optionaler Aufruf des Browsers zur Kontrolle
Start-Process "http://localhost:5000"
Das neue NuGet-Paket stellt das PublishProfile "DefaultContainer" bereit, welches das entsprechende Basisimage (hier "mcr.microsoft.com/dotnet/aspnet:7.0") wählt und konfiguriert. Docker muss installiert sein und der Zielcontainer läuft automatisch auf Linux x64.
(rme)