Raspberry Pi上的.NET Core + Docker。 这合法吗?

开放的.NET Core平台几乎可以在所有平台上运行:Windows,Mac和十几个Linux系统。 但是,还有一个SDK和运行时。 以前,运行Raspberry Pi的ARMv7 / ARMv8芯片不支持.NET Core SDK。 但是一切都变了。 有关如何在削减下运行的更多信息!



本文由Scott Hanselman撰写。 我请他发言。

我喜欢Raspberry Pi。 这些都是很棒的紧凑型学习机,孩子们真的很喜欢和他们一起玩。 即使这些孩子是成年人,他们也会创建一个由六个Kubernetes Raspberry Pi节点组成的集群

NET Core现在在RaspbianUbuntu等Linux ARM32发行版中受支持!

注意事项 Raspberry Pi 2+支持.NET Core 2.1。 Pi Zero或其他装有ARMv6芯片的设备不支持此功能。 要使用.NET Core,需要ARMv7或ARMv8芯片,例如ARM Cortex-A53。 Azure IoT Edge团队的专家使用.NET Core仿生ARM32 Docker .NET映像来支持开发人员在Edge设备上用C#编写

有两种方法可以在Raspberry Pi上运行.NET Core。

第一种方法使用Docker 。 实际上,这是使.NET Core在Pi上运行的最快,最简单的方法。 似乎令人难以置信,但是如此小的Raspberry Pi设备完全支持Docker平台容器。 这可以在几分钟内完成。 要快速安装Docker,您需要:

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

安装Docker之后,您必须登录并注销。 查看一个小示例,以确保.NET Core正常运行。 您可以 此处查看可用的Docker标签,并在此处了解有关.NET Core Docker模板的更多信息。

现在,我可以启动Docker,然后运行“ dotnet --info”命令来查找Pi上的dotnet。

 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 

太好了! 现在,我只请求dotnet:Raspberry Pi(RPi)上的2.1-sdk,由于它们使用Docker多体系结构文件,因此该平台可以正常工作。 如果要将.NET Core与ARM32上的Docker一起使用,则可以使用以下任何标记。

注意事项 前三个标签是Ubuntu 18.04的multi-archbionic 。 对于Debian 9,代码名称是Stretch 。所以我使用2.1-sdk,它在我的RPi上可以正常工作,但是如果需要的话,我可以更具体一些。

  • 2.1 SDK
  • 2.1运行时
  • 2.1-aspnetcore-运行时
  • 2.1-sdk-stretch-arm3
  • 2.1-运行时伸展-slim-arm32v7
  • 2.1-aspnetcore-runtime-stretch-slim-arm32v7
  • 2.1-sdk-bionic-arm32v7
  • 2.1运行时仿生arm32v7
  • 2.1-aspnetcore-runtime-bionic-arm32v7

以这种方式在几分钟内尝试一下:

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

他在这里下载图片...



在早期版本的.NET Core Docker文件中,如果在ARM上运行x64映像,则此方法将无效。

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

不同的处理器! 但是,使用Microsoft的Kendra Havens的体系结构标签 ,在2.1版中一切正常。

Docker具有 架构 功能 ,最近已开始在microsoft / dotnet-nightly中使用 。 计划在不久的将来将其转移到官方microsoft / dotnet存储库 。 多体系结构功能使您可以将一个标签用于多种机器配置。 如果没有此功能,则每个体系结构/操作系统/平台都需要唯一的标签。 例如,microsoft / dotnet:1.0-runtime标记基于Debian,而microsoft / dotnet:1.0-runtime-nanoserver标记基于Nano服务器。 使用多体系结构,将仅需要一个常见的microsoft / dotnet标记:1.0运行时。 如果从Linux容器环境中获取此标记,则将获得基于Debian的映像,而如果从Windows容器环境中获取,则将获得基于Nano Server的映像。 这有助于确保标签在整个Docker环境中保持一致,从而避免混淆。

在以上示例中,我可以执行以下操作:

在Docker映像中运行预配置的应用程序,例如:
docker run --rm microsoft/dotnet-samples:dotnetapp

在SDK映像中运行dotnet命令,例如:
docker run --rm -it microsoft/dotnet:2.1-sdk dotnet --info

在SDK映像中启动交互式终端,例如:
docker run --rm -it microsoft/dotnet:2.1-sdk

作为一个小示例,在这里我将进入容器并添加一个小型控制台应用程序并运行它,以证明这是可能的。 当我退出容器时,所有内容都会被删除。

 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! 

如果您自己尝试,则将注意到dotnet run命令很慢。 这是因为它执行恢复,构建和启动。 在这些小型设备上编译不会太快。 因此,值得做的工作尽可能少。 我不会一直运行dotnet,而是执行dotnet build命令,然后执行dotnet exec,这非常快。

如果您要尝试使用Docker和.NET Core,那么这些资源将对您非常有用。

使用Docker构建.NET Core应用程序



在容器中创建.NET Core应用程序



容器尺寸优化



ARM32 / RASPBERRY PI



在我看来, 这些示例非常有用...请务必查看Docker文件本身,因为它们将为您提供有关如何构建自己的文件的大量信息。 在小型设备(例如RPi)上工作时,创建多阶段Docker文件的能力至关重要。 建议尽量减少工作量,并让Docker自动缓存尽可能多的层。 如果您不考虑这一点,最终将花费10倍的时间为每个装配创建图像层。

使用测试在Docker上翻译一个真实的ASP.NET网站!


我可以将带有播客的网站转移到Docker,还可以在Raspberry Pi上构建/测试/运行它吗? 是的

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

太好了 现在,我可以执行docker build命令。 在Raspberry Pi上。 设备将还原,测试并构建它。 如果测试失败,则Docker构建将失败。

您会看到还有一个名为“ testrunner”的部分,然后是“ test?”。 本节不起作用。 它设置了ENTRYPOINT,但是暂时没有人使用它。 如果ENTRYPOINT位于Docker文件的最后一行,则它是一个隐式开始。 这样做是为了我可以找到他。

我可以构建它并像这样运行:

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

注意事项 请注意,“运行时”映像是microsoft / dotnet:2.1-aspnetcore-runtime,而不是microsoft / dotnet:2.1-runtime。 另外,aspnetcore以前包含运行ASP.NET应用程序所需的二进制代码,因此我只可以在csproj中包含一个指向“ />”的链接。 如果不使用aspnetcore-runtime基本映像,则必须手动激活我需要的所有ASP.NET Core程序包。 使用基本图像可以使最终图像文件更大,但这只是方便和大小之间的平衡。 由您决定。 为了方便起见,您可以仅手动启用所需的程序包,也可以使用“ Microsoft.AspNetCore.App”元程序包。 我的最终播客图像重205 MB,这还不错,但是,当然,如果我愿意的话,我可以通过几种方法来减少它。

而且,如果我只需要Docker的测试结果,我可以得到它们! 这意味着我可以在Docker容器中运行测试,在Linux容器和(理论上的)Windows主机之间挂载卷,然后在Visual Studio中打开生成的.trx文件!

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

看看! 这些是在Linux容器中执行的测试结果:



这是结果。 现在,我有一个播客站点在ARM32 Raspberry Pi 3上的Docker中运行,花了我一个小时的时间(编写Docker文件)!



第二种方式。 您到此为止了吗? 您只需在硬件上安装.NET Core 2.1 SDK。 不需要Docker,只需下载tar.gz并进行配置即可。 我可以将其安装在RPI ARM32v7 Dockerfile之类设备上 。 请注意,这样做时,我有一个通用的ASP.NET Core *运行时和* .NET Core SDK。 在最终版本中,您将获得一个包含所有内容的SDK,包括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 

跨平台万岁!

Source: https://habr.com/ru/post/zh-CN416449/


All Articles