Platform .NET Core terbuka berfungsi di hampir semua hal: Windows, Mac, dan selusin sistem Linux. Tetapi ada juga SDK dan Runtime. Sebelumnya, .NET Core SDK tidak didukung pada chip ARMv7 / ARMv8 yang menjalankan Raspberry Pi. Namun semuanya telah berubah. Lebih lanjut tentang cara menjalankan di bawah luka!
Artikel ini ditulis oleh Scott Hanselman . Saya memberinya lantai.Saya suka Raspberry Pi. Ini adalah mesin pembelajaran yang bagus, dan anak-anak sangat suka bermain dengannya. Bahkan jika anak-anak ini adalah orang dewasa, mereka
membuat sekelompok enam simpul Kubernetes Raspberry Pi .
NET Core sekarang didukung pada distribusi Linux ARM32 seperti Raspbian dan Ubuntu !Catatan .NET Core 2.1 didukung pada Raspberry Pi 2+. Ini tidak didukung pada Pi Zero atau perangkat lain dengan chip ARMv6. Untuk bekerja dengan .NET Core, diperlukan chip ARMv7 atau ARMv8, seperti ARM Cortex-A53. Spesialis dari tim Azure IoT Edge menggunakan .NET Core Bionic ARM32 Docker .NET gambar untuk mendukung pengembang menulis dalam C # pada perangkat Edge .
Ada dua cara untuk menjalankan .NET Core pada Raspberry Pi.
Cara pertama adalah
menggunakan Docker . Ini secara harfiah adalah cara tercepat dan termudah untuk menjalankan .NET Core pada Pi. Tampaknya sulit dipercaya, tetapi perangkat Raspberry Pi kecil seperti itu dengan sempurna mendukung wadah platform Docker. Ini bisa dilakukan dalam hitungan menit. Untuk menginstal Docker dengan cepat, Anda perlu:
curl -sSL https:
Setelah menginstal Docker, Anda harus masuk dan keluar. Lihat contoh kecil untuk memastikan bahwa .NET Core berfungsi dengan benar. Anda dapat melihat tag Docker yang tersedia
di , dan mempelajari lebih lanjut tentang templat .NET Core Docker di
sini .
Sekarang saya bisa meluncurkan Docker dan kemudian menjalankan perintah "dotnet --info" untuk mencari tahu tentang dotnet pada Pi saya.
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:
Ini bagus sekali! Sekarang saya hanya meminta dotnet: 2.1-SDK pada Raspberry Pi (RPi), dan karena mereka menggunakan file multi-arsitektur Docker, platform bekerja dengan benar. Jika Anda ingin menggunakan
.NET Core dengan Docker di ARM32 , Anda dapat menggunakan salah satu dari tag berikut.
Catatan Tiga tag pertama adalah multi-lengkungan dan bionik untuk Ubuntu 18.04. Nama kodenya adalah untuk Debian 9. Jadi saya menggunakan 2.1-SDK dan berfungsi dengan baik pada RPi saya, tapi saya bisa lebih spesifik jika saya mau.
- 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
Cobalah dalam beberapa menit dengan cara ini:
docker run --rm microsoft/dotnet-samples:dotnetapp
Di sini dia mengunduh gambar ...

Dalam versi sebelumnya dari file .NET Core Docker, ini tidak akan berfungsi jika Anda menjalankan gambar x64 pada ARM.
standard_init_linux.go:190: exec user process caused "exec format error"
Prosesor yang berbeda! Tetapi dengan
tag multi- arsitektur dari Kendra Havens dari Microsoft, semuanya berfungsi dengan baik di versi 2.1.
Docker memiliki fitur multi- arsitektur yang baru-baru ini mulai digunakan di microsoft / dotnet-nightly . Dalam waktu dekat ini direncanakan untuk mentransfer ini ke repositori microsoft / dotnet resmi. Fitur multi-arsitektur memungkinkan Anda untuk menggunakan satu tag untuk beberapa konfigurasi mesin. Tanpa fitur ini, tag unik diperlukan untuk setiap arsitektur / OS / platform. Misalnya, tag microsoft / dotnet: 1.0-runtime didasarkan pada Debian, dan tag microsoft / dotnet: 1.0-runtime-nanoserver ada di Server Nano. Dengan multi-arsitektur, hanya satu tag microsoft / dotnet yang umum akan dibutuhkan: 1.0-runtime. Jika Anda mengambil tag ini dari lingkungan wadah Linux, Anda mendapatkan gambar berdasarkan Debian, sedangkan jika Anda mengambilnya dari lingkungan wadah Windows, Anda mendapatkan gambar berdasarkan Server Nano. Ini membantu memastikan bahwa tag konsisten di seluruh lingkungan Docker, menghindari kebingungan.
Dalam contoh di atas, saya dapat melakukan hal berikut:
Jalankan aplikasi yang sudah dikonfigurasikan di dalam gambar Docker, misalnya:
docker run --rm microsoft/dotnet-samples:dotnetapp
Jalankan perintah dotnet dalam gambar SDK, misalnya:
docker run --rm -it microsoft/dotnet:2.1-sdk dotnet --info
Luncurkan terminal interaktif dalam gambar SDK, misalnya:
docker run --rm -it microsoft/dotnet:2.1-sdk
Sebagai contoh kecil, di sini saya akan masuk ke wadah dan menambahkan aplikasi konsol kecil dan menjalankannya, hanya untuk membuktikan bahwa ini mungkin. Semuanya akan dihapus ketika saya keluar dari wadah.
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!
Jika Anda mencobanya sendiri, Anda akan melihat bahwa perintah dotnet run lambat. Ini karena ia melakukan pemulihan, membangun, dan memulai. Kompilasi tidak berjalan terlalu cepat pada perangkat kecil ini. Oleh karena itu, perlu melakukan pekerjaan sesedikit mungkin. Alih-alih menjalankan dotnet run sepanjang waktu, saya akan mengeksekusi perintah dotnet build dan kemudian dotnet exec, yang sangat cepat.
Jika Anda akan mencoba Docker dan .NET Core, maka
sumber daya ini akan sangat berguna bagi Anda.
Membangun Aplikasi .NET Core Menggunakan Docker
Membuat .NET Core Applications dalam Wadah
- Pengembangan Aplikasi Core NET -. Contoh ini menunjukkan bagaimana mengembangkan, membangun, dan menguji aplikasi Core NET menggunakan Docker tanpa menginstal .NET Core SDK.
- Pengembangan Aplikasi Inti ASP.NET - Contoh ini menunjukkan bagaimana mengembangkan dan menguji aplikasi ASP.NET dasar menggunakan Docker tanpa menginstal .NET Core SDK.
Optimalisasi ukuran kontainer
ARM32 / RASPBERRY PI
Menurut saya
contoh-contoh ini sangat berguna ... Pastikan untuk melihat sendiri file Docker, karena mereka akan memberi Anda banyak informasi tentang cara membuat struktur file Anda sendiri. Kemampuan untuk membuat file Docker multi-tahap sangat penting ketika bekerja pada perangkat kecil, seperti RPi. Dianjurkan untuk melakukan pekerjaan sesedikit mungkin, dan biarkan Docker secara otomatis cache sebanyak mungkin lapisan. Jika Anda tidak memikirkan hal ini, Anda akan menghabiskan 10 kali lebih banyak untuk membuat layer gambar untuk setiap unit.
Terjemahan dari situs ASP.NET nyata di Docker dengan tes!
Bisakah saya mentransfer situs saya dengan podcast ke Docker, dan juga membuat / menguji / menjalankannya di Raspberry Pi? Ya!
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"]
Bagus Sekarang saya dapat menjalankan perintah build docker. pada Raspberry Pi. Perangkat akan memulihkan, menguji, dan membangunnya. Jika tes gagal, build Docker akan gagal.
Anda lihat, ada bagian tambahan yang disebut "testrunner", dan kemudian "test?" Setelah itu Bagian ini tidak berfungsi. Ini menetapkan ENTRYPOINT, tetapi tidak ada yang pernah menggunakannya ... untuk saat ini. ENTRYPOINT adalah awal yang tersirat jika berada di baris terakhir dalam file Docker. Ini dilakukan agar saya dapat menemukannya jika saya mau.
Saya hanya bisa membangunnya dan berlari seperti ini:
docker build -t podcast . docker run --rm -it -p 8000:80 podcast
Catatan Perhatikan bahwa gambar "runtime" adalah microsoft / dotnet: 2.1-aspnetcore-runtime, bukan microsoft / dotnet: 2.1-runtime. Juga, aspnetcore satu sebelumnya termasuk kode biner yang diperlukan untuk menjalankan aplikasi ASP.NET, jadi saya hanya bisa memasukkan satu tautan ke "/>" di csproj. Jika Anda tidak menggunakan gambar dasar aspnetcore-runtime, Anda harus mengaktifkan secara manual semua paket Core ASP.NET yang saya butuhkan. Menggunakan gambar dasar dapat membuat file gambar akhir lebih besar, tetapi ini hanya keseimbangan antara kenyamanan dan ukuran. Terserah kamu. Anda dapat secara manual mengaktifkan hanya paket yang Anda butuhkan atau menggunakan meta-paket "Microsoft.AspNetCore.App" untuk kenyamanan. Gambar podcast terakhir saya memiliki berat 205 megabita, yang tidak buruk, tetapi tentu saja, jika saya mau, saya dapat menguranginya dengan beberapa cara.
Dan jika saya hanya perlu hasil
tes dari Docker , saya bisa mendapatkannya! Ini berarti bahwa saya dapat menjalankan tes di wadah Docker, me-mount volume antara wadah Linux dan host (teoritis) Windows, dan kemudian membuka file .trx yang dihasilkan di 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
Lihat saja! Ini adalah hasil pengujian yang dilakukan dalam wadah Linux:

Inilah hasilnya. Sekarang saya memiliki situs podcast yang berjalan di Docker pada ARM32 Raspberry Pi 3, dan saya hanya butuh satu jam untuk bekerja (menulis file Docker)!
Cara kedua. Sudahkah Anda mencapai titik ini? Anda cukup menginstal .NET Core 2.1 SDK pada perangkat keras. Docker tidak diperlukan, cukup unduh tar.gz dan konfigurasikan. Saya dapat menginstalnya di
perangkat seperti RPI ARM32v7 Dockerfile . Perhatikan bahwa dalam melakukannya, saya memiliki ASP.NET Core * runtime dan * .NET Core SDK. Di versi final, Anda akan mendapatkan SDK yang akan mencakup semuanya, termasuk ASP.NET.
$ sudo apt-get -y update $ sudo apt-get -y install libunwind8 gettext $ wget https:
Platform lintas hidup yang panjang!