Hello World, Blazor im Container auf Raspberry PI
Das liegt schon etwas her, dass ich damit anfangen wollte ein Blog Eintrag über das Thema Docker zu schreiben.
Die Ursprungsidee ist, dass auf dem Raspberry PI die Webseite gehostet wird und darüber der Text eingegeben wird und später über eine Desktop Anwendung auf dem Raspberry PI wieder gegeben wird auf dem Bildschirm. Doch zunächst muss die Webseite in einem Container gestartet werden mit einem ARM System.
Benötigt wird:
- Raspberry PI 2 oder aktueller
- RaspbianOS
- Installation .NET 7 auf RaspbianOS
- Docker installtion auf Raspbian
Beispiel Webseite
Auf dem Raspberry PI soll eine Blazor Web Anwendung gehostet über einen Docker Container gehostet werden.
Vorbereitung
Für den Zugriff auf den Raspbian verwende ich Putty und die SSH Verbindung.
Docker installieren
Ein Befehl reicht, um die aktuelle Version von Docker zu installieren auf dem Raspberry PI
sudo curl -fsSL https://get.docker.com | sh
Nach installation kann die Docker version abgefragt werden.
docker --version
.NET installieren und prüfen
Mit dem folgenden Befehl wird das .NET installiert auf RaspbianOS und kann einige Minuten dauern. In meinem Fall habe ich .NET 7 installiert und musste die Version nicht direkt eingeben.
curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --channel STS
War die Installation erfolgreich, dann sollte das wie im folgenden Bild aussehen.
Damit der befehlt von das Abfragen der Versionsnummer funktioniert, sollte die Pfadauflösung geändert werden.
echo 'export DOTNET_ROOT=$HOME/.dotnet' >> ~/.bashrc
echo 'export PATH=$PATH:$HOME/.dotnet' >> ~/.bashrc
source ~/.bashrc
Die Versionsnummer abfrage sollte ohne "sudo" eingabe funktionieren.
dotnet --version
Blazor Projekt erstellen
Zum testen kann direkt auf dem Raspberry PI ein Blazor Projekt erstellt werden. Natürlich macht das mehr sinn, sein Projekt auf dem System zu erstellen, wo man selbst auch Programmiert.
Da auf dem RaspbianOS kein Visual Studio 2022 habe, kann ich mit Hilfe von .NET das Projekt direkt per Befehl erzeugen. Aber zunächst muss ein Ordner erstellt werden, in der später auch die Dockerfile Datei hinzugefügt wird.
Dann anschließend in das Verzeichnis wechseln: cd ExampleBlazorApp
Mit dem erstellen der Blazor WebAssembly Standalone Anwendung, wird wiederum ein Verzeichnis erstellt.
dotnet new blazorwasm -o ExampleBlazorProject
Das erstellen dauert ca. eine halbe Minute. Wurde das erstellen zum ersten mal verwendet, werden am Ende deutlich Mehr Informationen angezeigt als im folgenden Bild.
Jetzt noch die Dockerfile erstellen im selben Verzeichnis mit dem Editor 'nano':
nano Dockerfile
Inhalt der Dockerfile. Hier ist darauf zu achten, dass die Dockerfile im selben Ordner steckt wie der Projekt Ordner selbst:
# Build stage
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
# Copy the .csproj file and restore the dependencies
COPY ["ExampleBlazorProject/ExampleBlazorProject.csproj", "ExampleWebAssembly/"]
RUN dotnet restore "ExampleBlazorProject/ExampleBlazorProject.csproj"
# Copy the rest of the application code
COPY . .
WORKDIR "/src/ExampleBlazorProject"
RUN dotnet build "ExampleBlazorProject.csproj" -c Release -o /app/build
RUN dotnet publish "ExampleBlazorProject.csproj" -c Release -o /app/publish
# Final stage
FROM nginx:alpine AS final
COPY --from=build /app/publish/wwwroot /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Mit STRG + X kann die Anwendung dann beendet werden. Bevor jedoch die Anwendung 'Nano' geschlossen wird, wird abgefragt, ob die Änderung gespeichert werden soll.
Mit Y oder J Taste drücken…
… und anschließend Enter-Taste drücken. Fertig.
Nun sollte im Verzeichnis die Datei 'Dockerfile' vorhanden sein.
Nun sollte sich das Beispiel Projekt als Docker Container erstellen lassen. Der Name des Container muss komplett klein geschrieben sein.
sudo docker build -t exampleblazorcontainer .
Die Ausführung dauert eine weile (5 bis 6 Minuten), da einige Dinge Extrahiert werden und Inhalte geladen werden.
Nun der letzte Schritt, der Zeigt, dass man eine Blazor Anwendung komplett auf Linux erstellen kann.
sudo docker run -d -p 8081:80 --name myblazorapp exampleblazorcontainer
Wenn alles geklappt hat, sollte über die Docker abfrage dann sichtbar sein, dass der Container läuft.
Schlusssatz
Ich hatte ganz vergessen, dass man seit .NET Core, eine Web Anwendung komplett in Linux aufstellen kann. Und so wie das jetzt ist, finde ich die Lösung mit Blazor sehr gelungen. Der Weg ist selbst nicht intuitiv und musste daher schon einiges Ausprobieren und recherchieren. Hilfreich war natürlich auch ChatGpt, welches sich wieder als sehr gutes Werkzeug macht und Zeit erspart, unzählige veraltete Forum Einträge durch zu lesen.
Eigentlich wollte ich das mit .NET 8. Doch zu diesen Zeitpunkt (20.05.2024) hatte ich noch Probleme mit der Version und hatte mich auch nicht länger beschäftigt.
Resourcen
Bereitstellen von .NET-Apps auf ARM-Single-Board-Computern - .NET | Microsoft Learn
ChatGpt
Kommentare