.NET Core + Docker على Raspberry Pi. هل هذا قانوني؟

تعمل منصة .NET Core المفتوحة على كل شيء تقريبًا: Windows و Mac وعشرات أنظمة Linux. ولكن هناك أيضًا SDK و Runtime. في السابق ، لم يكن .NET Core SDK مدعومًا على شرائح ARMv7 / ARMv8 التي تقوم بتشغيل Raspberry Pi. لكن كل شيء تغير. المزيد عن كيفية الركض تحت القطع!



كتب سكوت هانسيلمان هذه المقالة. أعطيه الكلمة.

أنا أحب التوت بي. هذه هي آلات تعليمية مدمجة رائعة ، ويحب الأطفال حقًا اللعب معهم. حتى لو كان هؤلاء الأطفال بالغين ، يقومون بإنشاء مجموعة من ست عقد Kubernetes Raspberry Pi .

NET Core مدعوم الآن على توزيعات Linux ARM32 مثل Raspbian و Ubuntu !

ملاحظة .NET Core 2.1 مدعوم على Raspberry Pi 2+. لا يتم دعمه على Pi Zero أو الأجهزة الأخرى المزودة بشريحة ARMv6. للعمل مع .NET Core ، يلزم وجود شريحة ARMv7 أو ARMv8 ، مثل ARM Cortex-A53. يستخدم المتخصصون من فريق Azure IoT Edge صور .NET Core Bionic ARM32 Docker .NET لدعم مطوري الكتابة في C # على أجهزة Edge .

هناك طريقتان لتشغيل .NET Core على Raspberry Pi.

الطريقة الأولى هي استخدام 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" لمعرفة dotnet على جهاز 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 

هذا رائع! الآن أنا فقط أطلب dotnet: 2.1-sdk على Raspberry Pi (RPi) ، وبما أنهم يستخدمون ملفات Docker متعددة البنية ، فإن النظام الأساسي يعمل بشكل صحيح. إذا كنت تريد استخدام .NET Core مع Docker على ARM32 ، يمكنك استخدام أي من العلامات التالية.

ملاحظة العلامات الثلاث الأولى هي متعددة الأقواس وبيونيك لـ Ubuntu 18.04. اسم الرمز هو امتداد لـ Debian 9. لذلك أستخدم 2.1-sdk وهو يعمل بشكل جيد على RPi الخاص بي ، ولكن يمكنني أن أكون أكثر تحديدًا إذا أردت.

  • 2.1-SDK
  • 2.1 وقت التشغيل
  • 2.1-aspnetcore-runtime
  • 2.1-sdk-stretch-arm3
  • 2.1-runtime-stretch-slim-arm-32 v7
  • 2.1-aspnetcore-runtime-stretch-slim-arm32v7
  • 2.1-sdk-bionic-arm32v7
  • 2.1-runtime-bionic-arm32v7
  • 2.1-aspnetcore-runtime-bionic-arm32v7

جربها في دقائق بهذه الطريقة:

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

هنا يقوم بتنزيل الصورة ...



في الإصدارات السابقة من ملفات .NET Core Docker ، لن يعمل هذا إذا قمت بتشغيل صورة x64 على ARM.

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

معالجات مختلفة! ولكن مع علامات متعددة العمارة من Kendra Havens من Microsoft ، كل شيء يعمل بشكل جيد في الإصدار 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-runtime. إذا أخذت هذه العلامة من بيئة حاوية Linux ، فستحصل على صورة تستند إلى Debian ، بينما إذا أخذتها من بيئة حاوية Windows ، فستحصل على صورة تستند إلى Nano Server. وهذا يساعد على ضمان اتساق العلامات عبر بيئة Docker ، وتجنب الارتباك.

في الأمثلة أعلاه ، يمكنني القيام بما يلي:

قم بتشغيل تطبيق تم تكوينه مسبقًا داخل صورة Docker ، على سبيل المثال:
docker run --rm microsoft/dotnet-samples:dotnetapp

قم بتشغيل أوامر dotnet في صورة SDK ، على سبيل المثال:
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 ، فستكون هذه الموارد مفيدة لك بشكل لا يصدق.

بناء تطبيقات .NET الأساسية باستخدام Docker



إنشاء تطبيقات .NET الأساسية في حاوية


  • تطوير تطبيقات .NET Core - يوضح هذا المثال كيفية تطوير تطبيقات .NET Core وإنشائها واختبارها باستخدام Docker بدون تثبيت .NET Core SDK.
  • ASP.NET Core Application Development - يوضح هذا المثال كيفية تطوير واختبار تطبيقات ASP.NET الأساسية باستخدام Docker بدون تثبيت .NET Core SDK.

تحسين حجم الحاوية



ARM32 / التوت RI



يبدو لي أن هذه الأمثلة مفيدة جدًا ... تأكد من إلقاء نظرة على ملفات Docker نفسها ، لأنها ستوفر لك كمية هائلة من المعلومات حول كيفية بناء ملفاتك الخاصة. تعد القدرة على إنشاء ملفات Docker متعددة المراحل أمرًا بالغ الأهمية عند العمل على جهاز صغير ، مثل RPi. من المستحسن القيام بأقل قدر ممكن من العمل ، والسماح لـ Docker بتخزين أكبر عدد ممكن من الطبقات تلقائيًا. إذا لم تفكر في هذه النقطة ، فسوف ينتهي بك الأمر إلى قضاء 10 أضعاف الوقت في إنشاء طبقات الصورة لكل تجميع.

ترجمة موقع ASP.NET حقيقي على Docker مع الاختبارات!


هل يمكنني نقل موقعي باستخدام ملفات بودكاست إلى 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.

ترى ، هناك قسم إضافي يسمى "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 one سابقًا رمزًا ثنائيًا مطلوبًا لتشغيل تطبيق ASP.NET ، لذا يمكنني فقط تضمين رابط واحد إلى "/>" في csproj. إذا لم تستخدم الصورة الأساسية لـ aspnetcore-runtime ، فسيتعين عليك تنشيط جميع حزم ASP.NET Core التي أحتاجها يدويًا. يمكن أن يؤدي استخدام صورة أساسية إلى جعل ملفات الصور النهائية أكبر ، ولكن هذا مجرد توازن بين الراحة والحجم. الأمر متروك لك. يمكنك تمكين الحزم التي تحتاجها يدويًا فقط أو استخدام الحزمة الوصفية "Microsoft.AspNetCore.App" من أجل الراحة. كانت الصورة النهائية لبودكاست تزن 205 ميغابايت ، وهذا ليس سيئًا ، ولكن بالطبع ، إذا أردت ذلك ، يمكنني تقليله بعدة طرق.

وإذا كنت بحاجة فقط إلى نتائج الاختبار من Docker ، يمكنني الحصول عليها! هذا يعني أنه يمكنني تشغيل الاختبار في حاوية Docker ، وتركيب وحدة التخزين بين حاوية Linux ومضيف Windows (النظري) ، ثم فتح ملف .trx الناتج في 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 

فقط انظر! هذه هي نتائج الاختبار الذي تم إجراؤه في حاوية Linux:



ها هي النتيجة. الآن لدي موقع بودكاست يعمل في Docker على ARM32 Raspberry Pi 3 ، واستغرق الأمر مني ساعة فقط للعمل (كتابة ملف 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/ar416449/


All Articles