.NET Core + Docker en Raspberry Pi. ¿Es esto legal?

La plataforma abierta .NET Core funciona en casi todo: Windows, Mac y una docena de sistemas Linux. Pero también hay un SDK y Runtime. Anteriormente, .NET Core SDK no era compatible con los chips ARMv7 / ARMv8 que ejecutan Raspberry Pi. Pero todo ha cambiado. ¡Más sobre cómo correr bajo el corte!



Este artículo fue escrito por Scott Hanselman . Le doy la palabra.

Me gusta la Raspberry Pi. Estas son excelentes máquinas de aprendizaje compactas, y a los niños realmente les gusta jugar con ellas. Incluso si estos niños son adultos, crean un grupo de seis nodos Kubernetes Raspberry Pi .

¡NET Core ahora es compatible con distribuciones Linux ARM32 como Raspbian y Ubuntu !

Nota .NET Core 2.1 es compatible con Raspberry Pi 2+. No es compatible con Pi Zero u otros dispositivos con un chip ARMv6. Para trabajar con .NET Core, se requiere un chip ARMv7 o ARMv8, como un ARM Cortex-A53. Los especialistas del equipo Azure IoT Edge usan las imágenes .NET Core Bionic ARM32 Docker .NET para ayudar a los desarrolladores que escriben en C # en dispositivos Edge .

Hay dos formas de ejecutar .NET Core en Raspberry Pi.

La primera forma es usar Docker . Esta es literalmente la forma más rápida y fácil de hacer que .NET Core se ejecute en una Pi. Parece increíble, pero estos pequeños dispositivos Raspberry Pi son perfectamente compatibles con los contenedores de la plataforma Docker. Esto se puede hacer en minutos. Para instalar rápidamente Docker, necesitará:

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

Después de instalar Docker, debe iniciar y cerrar sesión. Consulte un pequeño ejemplo para asegurarse de que .NET Core funciona correctamente. Puede ver las etiquetas Docker disponibles en y obtener más información sobre las plantillas .NET Core Docker aquí .

Ahora puedo iniciar Docker y luego ejecutar el comando "dotnet --info" para obtener información sobre dotnet en mi 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 

¡Esto es simplemente genial! Ahora solo solicito dotnet: 2.1-sdk en Raspberry Pi (RPi), y dado que usan archivos de arquitectura múltiple Docker, la plataforma funciona correctamente. Si desea usar .NET Core con Docker en ARM32 , puede usar cualquiera de las siguientes etiquetas.

Nota Las primeras tres etiquetas son multi-arch y bionic para Ubuntu 18.04. El nombre en código es elástico para Debian 9. Así que uso 2.1-sdk y funciona bien en mi RPi, pero puedo ser más específico si lo deseo.

  • 2.1-SDK
  • 2.1-tiempo de ejecución
  • 2.1-aspnetcore-runtime
  • 2.1-SDK-estiramiento-brazo3
  • 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

Pruébalo en minutos de esta manera:

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

Aquí descarga la imagen ...



En versiones anteriores de archivos .NET Core Docker, esto no funcionaría si ejecutara la imagen x64 en ARM.

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

Diferentes procesadores! Pero con las etiquetas de arquitectura múltiple de Kendra Havens de Microsoft, todo funciona bien en la versión 2.1.

Docker tiene una función de arquitectura múltiple que recientemente comenzó a usarse en microsoft / dotnet-nightly . En un futuro cercano, se planea transferir esto al repositorio oficial de microsoft / dotnet . La función de arquitectura múltiple le permite usar una etiqueta para múltiples configuraciones de máquina. Sin esta característica, se requiere una etiqueta única para cada arquitectura / SO / plataforma. Por ejemplo, la etiqueta microsoft / dotnet: 1.0-runtime está basada en Debian, y la etiqueta microsoft / dotnet: 1.0-runtime-nanoserver está en el Nano Server. Con la arquitectura múltiple, solo se necesitará una etiqueta común de microsoft / dotnet: 1.0-runtime. Si toma esta etiqueta del entorno contenedor de Linux, obtendrá una imagen basada en Debian, mientras que si la toma del entorno contenedor de Windows, obtendrá una imagen basada en Nano Server. Esto ayuda a garantizar que las etiquetas sean coherentes en todo el entorno de Docker, evitando confusiones.

En los ejemplos anteriores, puedo hacer lo siguiente:

Ejecute una aplicación preconfigurada dentro de una imagen de Docker, por ejemplo:
docker run --rm microsoft/dotnet-samples:dotnetapp

Ejecute comandos dotnet en una imagen SDK, por ejemplo:
docker run --rm -it microsoft/dotnet:2.1-sdk dotnet --info

Inicie un terminal interactivo en una imagen SDK, por ejemplo:
docker run --rm -it microsoft/dotnet:2.1-sdk

Como un pequeño ejemplo, aquí iré al contenedor y agregaré una pequeña aplicación de consola y la ejecutaré, solo para demostrar que esto es posible. Todo se eliminará cuando salga del contenedor.

 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 lo prueba usted mismo, notará que el comando de ejecución dotnet es lento. Esto se debe a que realiza la recuperación, la compilación y el inicio. La compilación no va demasiado rápido en estos pequeños dispositivos. Por lo tanto, vale la pena hacer el menor trabajo posible. En lugar de ejecutar dotnet run todo el tiempo, ejecutaré el comando de compilación dotnet y luego el dotnet exec, que son muy rápidos.

Si va a probar Docker y .NET Core, entonces estos recursos serán increíblemente útiles para usted.

Creación de aplicaciones .NET Core con Docker



Crear aplicaciones .NET Core en un contenedor



Optimización del tamaño del contenedor.



ARM32 / FRAMBUESA PI



Me parece que estos ejemplos son muy útiles ... Asegúrese de mirar los archivos Docker, ya que le brindarán una gran cantidad de información sobre cómo estructurar sus propios archivos. La capacidad de crear archivos Docker de varias etapas es fundamental cuando se trabaja en un dispositivo pequeño, como RPi. Es recomendable hacer el menor trabajo posible y dejar que Docker almacene en caché automáticamente tantas capas como sea posible. Si no piensa en este punto, terminará pasando 10 veces más tiempo creando capas de imágenes para cada ensamblaje.

¡Traducción de un sitio ASP.NET real en Docker con pruebas!


¿Puedo transferir mi sitio con podcasts a Docker y también compilarlo / probarlo / ejecutarlo en Raspberry Pi? Si!

 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"] 

Genial Ahora puedo ejecutar el comando docker build. en la Raspberry Pi. El dispositivo lo restaurará, probará y construirá. Si la prueba falla, la compilación de Docker fallará.

Verá, hay una sección adicional llamada "testrunner", y luego "¿prueba?" Esta sección no funciona. Establece ENTRYPOINT, pero nadie lo usa ... por ahora. ENTRYPOINT es un inicio implícito si está en la última línea del archivo Docker. Esto se hace para poder encontrarlo si quiero.

Solo puedo construirlo y ejecutarlo así:

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

Nota Tenga en cuenta que la imagen de "tiempo de ejecución" es microsoft / dotnet: 2.1-aspnetcore-runtime, no microsoft / dotnet: 2.1-runtime. Además, aspnetcore one incluye previamente el código binario que se necesita para ejecutar la aplicación ASP.NET, por lo que solo puedo incluir un enlace a "/>" en csproj. Si no usó la imagen base de aspnetcore-runtime, tendría que activar manualmente todos los paquetes de ASP.NET Core que necesito. El uso de una imagen básica puede agrandar los archivos de imagen finales, pero esto es solo un equilibrio entre conveniencia y tamaño. Depende de usted. Puede habilitar manualmente solo los paquetes que necesita o utilizar el metapaquete "Microsoft.AspNetCore.App" para su comodidad. Mi imagen final de podcast pesaba 205 megabytes, lo que no está mal, pero, por supuesto, si quisiera, podría reducirlo de varias maneras.

Y si solo necesito los resultados de las pruebas de Docker , ¡puedo obtenerlos! Esto significa que puedo ejecutar la prueba en el contenedor Docker, montar el volumen entre el contenedor Linux y el host (teórico) de Windows, ¡y luego abrir el archivo .trx resultante en 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 

¡Solo mira! Estos son los resultados de las pruebas que se realizaron en un contenedor de Linux:



Aquí está el resultado. Ahora tengo un sitio de podcast en Docker en el ARM32 Raspberry Pi 3, ¡y me tomó solo una hora trabajar (escribir un archivo Docker)!



El segundo camino. ¿Has llegado a este punto? Simplemente puede instalar .NET Core 2.1 SDK en el hardware. No se necesita Docker, solo descarga tar.gz y configúralo. Puedo instalarlo en un dispositivo como RPI ARM32v7 Dockerfile . Tenga en cuenta que al hacerlo, tengo un ASP.NET Core * runtime común y * .NET Core SDK. En la versión final, obtendrá un SDK que incluirá todo, incluido 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 

¡Viva multiplataforma!

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


All Articles