.NET Core + Docker sur Raspberry Pi. Est-ce légal?

La plate-forme ouverte .NET Core fonctionne sur presque tout: Windows, Mac et une douzaine de systèmes Linux. Mais il existe également un SDK et Runtime. Auparavant, le SDK .NET Core n'était pas pris en charge sur les puces ARMv7 / ARMv8 qui exécutent le Raspberry Pi. Mais tout a changé. Plus sur la façon de courir sous la coupe!



Cet article a été écrit par Scott Hanselman . Je lui donne la parole.

J'aime le Raspberry Pi. Ce sont d'excellentes machines d'apprentissage compactes, et les enfants aiment vraiment jouer avec eux. Même si ces enfants sont des adultes, ils créent un cluster de six nœuds Kubernetes Raspberry Pi .

NET Core est désormais pris en charge sur les distributions Linux ARM32 comme Raspbian et Ubuntu !

Remarque .NET Core 2.1 est pris en charge sur le Raspberry Pi 2+. Il n'est pas pris en charge sur Pi Zero ou d'autres appareils avec une puce ARMv6. Pour fonctionner avec .NET Core, une puce ARMv7 ou ARMv8, telle qu'une ARM Cortex-A53, est requise. Les spécialistes de l'équipe Azure IoT Edge utilisent les images .NET Core Bionic ARM32 Docker .NET pour prendre en charge les développeurs écrivant en C # sur les appareils Edge .

Il existe deux façons d'exécuter .NET Core sur le Raspberry Pi.

La première consiste à utiliser Docker . C'est littéralement le moyen le plus rapide et le plus simple de faire fonctionner .NET Core sur un Pi. Cela semble incroyable, mais ces petits appareils Raspberry Pi prennent parfaitement en charge les conteneurs de la plate-forme Docker. Cela peut se faire en quelques minutes. Pour installer rapidement Docker, vous aurez besoin de:

curl -sSL https://get.docker.com | sh sudo usermod -aG docker pi 

Après avoir installé Docker, vous devez vous connecter et vous déconnecter. Consultez un petit exemple pour vous assurer que .NET Core fonctionne correctement. Vous pouvez voir les balises Docker disponibles sur et en savoir plus sur les modèles Docker .NET Core ici .

Maintenant, je peux simplement lancer Docker, puis exécuter la commande «dotnet --info» pour en savoir plus sur dotnet sur mon Pi.

 pi@raspberrypi:~ $ docker run --rm -it microsoft/dotnet:2.1-sdk dotnet --info .NET Core SDK (reflecting any global.json): Version: 2.1.300-rc1-008673 Commit: f5e3ddbe73 Runtime Environment: OS Name: debian OS Version: 9 OS Platform: Linux RID: debian.9-x86 Base Path: /usr/share/dotnet/sdk/2.1.300-rc1-008673/ Host (useful for support): Version: 2.1.0-rc1 Commit: eb9bc92051 .NET Core SDKs installed: 2.1.300-rc1-008673 [/usr/share/dotnet/sdk] .NET Core runtimes installed: Microsoft.NETCore.App 2.1.0-rc1 [/usr/share/dotnet/shared/Microsoft.NETCore.App] To install additional .NET Core runtimes or SDKs: https://aka.ms/dotnet-download 

C'est tout simplement génial! Maintenant, je demande juste dotnet: 2.1-sdk sur le Raspberry Pi (RPi), et comme ils utilisent des fichiers multi-architecture Docker, la plate-forme fonctionne correctement. Si vous souhaitez utiliser .NET Core avec Docker sur ARM32 , vous pouvez utiliser l'une des balises suivantes.

Remarque Les trois premières balises sont multi-arch et bioniques pour Ubuntu 18.04. Le nom de code est extensible pour Debian 9. J'utilise donc 2.1-sdk et cela fonctionne très bien sur mon RPi, mais je peux être plus précis si je veux.

  • 2.1-sdk
  • 2.1-runtime
  • 2.1-aspnetcore-runtime
  • 2.1-sdk-stretch-arm3
  • 2.1-runtime-stretch-slim-arm32v7
  • 2.1-aspnetcore-runtime-stretch-slim-arm32v7
  • 2.1-sdk-bionic-arm32v7
  • 2.1-runtime-bionic-arm32v7
  • 2.1-aspnetcore-runtime-bionic-arm32v7

Essayez-le en quelques minutes de cette façon:

 docker run --rm microsoft/dotnet-samples:dotnetapp 

Ici, il télécharge l'image ...



Dans les versions précédentes des fichiers Docker .NET Core, cela ne fonctionnerait pas si vous exécutiez l'image x64 sur ARM.

 standard_init_linux.go:190: exec user process caused "exec format error" 

Différents processeurs! Mais avec les balises multi- architecture de Kendra Havens de Microsoft, tout fonctionne bien dans la version 2.1.

Docker a une fonctionnalité multi- architecture qui a récemment commencé à être utilisée dans microsoft / dotnet-nightly . Dans un avenir proche, il est prévu de le transférer vers le dépôt officiel Microsoft / Dotnet . La fonctionnalité multi-architecture vous permet d'utiliser une balise pour plusieurs configurations de machine. Sans cette fonctionnalité, une balise unique est requise pour chaque architecture / système d'exploitation / plate-forme. Par exemple, la balise microsoft / dotnet: 1.0-runtime est basée sur Debian, et la balise microsoft / dotnet: 1.0-runtime-nanoserver se trouve sur le Nano Server. Avec la multi-architecture, une seule balise microsoft / dotnet commune sera nécessaire: 1.0-runtime. Si vous prenez cette balise de l'environnement de conteneur Linux, vous obtenez une image basée sur Debian, alors que si vous la prenez de l'environnement de conteneur Windows, vous obtenez une image basée sur Nano Server. Cela permet de garantir la cohérence des balises dans l'environnement Docker, en évitant toute confusion.

Dans les exemples ci-dessus, je peux faire ce qui suit:

Exécutez une application préconfigurée dans une image Docker, par exemple:
docker run --rm microsoft/dotnet-samples:dotnetapp

Exécutez les commandes dotnet dans une image SDK, par exemple:
docker run --rm -it microsoft/dotnet:2.1-sdk dotnet --info

Lancez un terminal interactif dans une image SDK, par exemple:
docker run --rm -it microsoft/dotnet:2.1-sdk

Comme petit exemple, ici je vais aller dans le conteneur et ajouter une petite application console et l'exécuter, juste pour prouver que c'est possible. Tout sera supprimé lorsque je quitterai le conteneur.

 pi@raspberrypi:~ $ docker run --rm -it microsoft/dotnet:2.1-sdk root@063f3c50c88a:/# ls bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var root@063f3c50c88a:/# cd ~ root@063f3c50c88a:~# mkdir mytest root@063f3c50c88a:~# cd mytest/ root@063f3c50c88a:~/mytest# dotnet new console The template "Console Application" was created successfully. Processing post-creation actions... Running 'dotnet restore' on /root/mytest/mytest.csproj... Restoring packages for /root/mytest/mytest.csproj... Installing Microsoft.NETCore.DotNetAppHost 2.1.0-rc1. Installing Microsoft.NETCore.DotNetHostResolver 2.1.0-rc1. Installing NETStandard.Library 2.0.3. Installing Microsoft.NETCore.DotNetHostPolicy 2.1.0-rc1. Installing Microsoft.NETCore.App 2.1.0-rc1. Installing Microsoft.NETCore.Platforms 2.1.0-rc1. Installing Microsoft.NETCore.Targets 2.1.0-rc1. Generating MSBuild file /root/mytest/obj/mytest.csproj.nuget.g.props. Generating MSBuild file /root/mytest/obj/mytest.csproj.nuget.g.targets. Restore completed in 15.8 sec for /root/mytest/mytest.csproj. Restore succeeded. root@063f3c50c88a:~/mytest# dotnet run Hello World! root@063f3c50c88a:~/mytest# dotnet exec bin/Debug/netcoreapp2.1/mytest.dll Hello World! 

Si vous l'essayez vous-même, vous remarquerez que la commande dotnet run est lente. En effet, il effectue la récupération, la génération et le démarrage. La compilation ne va pas trop vite sur ces petits appareils. Par conséquent, cela vaut la peine de faire le moins de travail possible. Au lieu d'exécuter dotnet tout le temps, j'exécuterai la commande dotnet build puis l'exécutable dotnet, qui sont très rapides.

Si vous allez essayer Docker et .NET Core, ces ressources vous seront incroyablement utiles.

Création d'applications .NET Core à l'aide de Docker



Création d'applications .NET Core dans un conteneur



Optimisation de la taille des conteneurs



ARM32 / FRAMBOISE PI



Il me semble que ces exemples sont très utiles ... Assurez-vous de regarder les fichiers Docker eux-mêmes, car ils vous donneront une énorme quantité d'informations sur la façon de structurer vos propres fichiers. La possibilité de créer des fichiers Docker en plusieurs étapes est essentielle lorsque vous travaillez sur un petit appareil, tel que RPi. Il est conseillé de faire le moins de travail possible et de laisser Docker mettre automatiquement en cache autant de couches que possible. Si vous ne réfléchissez pas à ce point, vous finirez par passer 10 fois plus de temps à créer des calques d'images pour chaque assemblage.

Traduction d'un vrai site ASP.NET sur Docker avec des tests!


Puis-je transférer mon site avec des podcasts vers Docker, et aussi le construire / tester / l'exécuter sur Raspberry Pi? Oui!

 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /app # copy csproj and restore as distinct layers COPY *.sln . COPY hanselminutes.core/*.csproj ./hanselminutes.core/ COPY hanselminutes.core.tests/*.csproj ./hanselminutes.core.tests/ RUN dotnet restore # copy everything else and build app COPY . . WORKDIR /app/hanselminutes.core RUN dotnet build FROM build AS testrunner WORKDIR /app/hanselminutes.core.tests ENTRYPOINT ["dotnet", "test", "--logger:trx"] FROM build AS test WORKDIR /app/hanselminutes.core.tests RUN dotnet test FROM build AS publish WORKDIR /app/hanselminutes.core RUN dotnet publish -c Release -o out FROM microsoft/dotnet:2.1-aspnetcore-runtime AS runtime WORKDIR /app COPY --from=publish /app/hanselminutes.core/out ./ ENTRYPOINT ["dotnet", "hanselminutes.core.dll"] 

Super Maintenant, je peux exécuter la commande docker build. sur le Raspberry Pi. L'appareil le restaurera, le testera et le construira. Si le test échoue, la génération Docker échouera.

Vous voyez, il y a une section supplémentaire appelée "testrunner", puis "test?" Après Cette section ne fonctionne pas. Il définit ENTRYPOINT, mais personne ne l'utilise jamais ... pour l'instant. ENTRYPOINT est un début implicite s'il se trouve sur la dernière ligne du fichier Docker. Ceci est fait pour que je puisse le retrouver si je veux.

Je peux simplement le construire et courir comme ceci:

 docker build -t podcast . docker run --rm -it -p 8000:80 podcast 

Remarque Notez que l'image «runtime» est microsoft / dotnet: 2.1-aspnetcore-runtime, et non microsoft / dotnet: 2.1-runtime. En outre, aspnetcore one inclut précédemment le code binaire nécessaire pour exécuter l'application ASP.NET, donc je peux simplement inclure un lien vers "/>" dans csproj. Si vous n'avez pas utilisé l'image de base d'exécution aspnetcore, vous devez activer manuellement tous les packages ASP.NET Core dont j'ai besoin. L'utilisation d'une image de base peut agrandir les fichiers d'image finaux, mais ce n'est qu'un équilibre entre commodité et taille. Ça dépend de vous. Vous pouvez activer manuellement uniquement les packages dont vous avez besoin ou utiliser le méta-package «Microsoft.AspNetCore.App» pour plus de commodité. Mon image de podcast finale pesait 205 mégaoctets, ce qui n'est pas mal, mais, bien sûr, si je le voulais, je pourrais la réduire de plusieurs façons.

Et si j'ai juste besoin des résultats des tests de Docker , je peux les obtenir! Cela signifie que je peux exécuter le test dans le conteneur Docker, monter le volume entre le conteneur Linux et l'hôte Windows (théorique), puis ouvrir le fichier .trx résultant dans Visual Studio!

 docker build --pull --target testrunner -t podcast:test . docker run --rm -v D:\github\hanselminutes-core\TestResults:/app/hanselminutes.core.tests/TestResults podcast:test 

Regardez! Voici les résultats des tests effectués dans un conteneur Linux:



Voici le résultat. J'ai maintenant un site de podcast fonctionnant dans Docker sur le ARM32 Raspberry Pi 3, et cela m'a pris juste une heure pour travailler (écrire un fichier Docker)!



La deuxième façon. Avez-vous atteint ce point? Vous pouvez simplement installer le SDK .NET Core 2.1 sur le matériel. Docker n'est pas nécessaire, téléchargez simplement tar.gz et configurez-le. Je peux l'installer sur un appareil comme RPI ARM32v7 Dockerfile . Notez que ce faisant, j'ai un runtime ASP.NET Core * et * .NET Core SDK communs. Dans la version finale, vous obtiendrez un SDK qui comprendra tout, y compris ASP.NET.

 $ sudo apt-get -y update $ sudo apt-get -y install libunwind8 gettext $ wget https://dotnetcli.blob.core.windows.net/dotnet/Sdk/2.1.300-rc1-008673/dotnet-sdk-2.1.300-rc1-008673-linux-arm.tar.gz $ wget https://dotnetcli.blob.core.windows.net/dotnet/aspnetcore/Runtime/2.1.0-rc1-final/aspnetcore-runtime-2.1.0-rc1-final-linux-arm.tar.gz $ sudo mkdir /opt/dotnet $ sudo tar -xvf dotnet-sdk-2.1.300-rc1-008673-linux-arm.tar.gz -C /opt/dotnet/ $ sudo tar -xvf aspnetcore-runtime-2.1.0-rc1-final-linux-arm.tar.gz -C /opt/dotnet/ $ sudo ln -s /opt/dotnet/dotnet /usr/local/bin $ dotnet --info 

Longue vie multiplateforme!

Source: https://habr.com/ru/post/fr416449/


All Articles