GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

Raspberry Pi (ARM32) 上の Docker での .NET Core および ASP.NET Core 2.1 のビルド、実行、およびテスト

ラズベリーパイが大好きです。彼らは素晴らしい小さな学習機械であり、子供たちが遊ぶのはとても楽しいです.それらの子供たちが大人で、6 ノードの Kubernetes Raspberry Pi クラスターを構築したとしても。

オープン ソースの .NET Core は、Windows、Mac、および多数の Linux など、基本的にあらゆる場所で動作します。ただし、SDK (コンパイルしてビルドする) とランタイム (アプリを実際に実行する) があります。以前は、Raspberry Pi のような ARMv7/ARMv8 チップでは、.NET Core SDK (明確に言うと、「ドットネット ビルド」機能) はサポートされていませんでした。

<ブロック引用>

Linux ARM32 ディストリビューションで .NET Core がサポートされるようになりました。 ラズビアン Ubuntu !

注: .NET Core 2.1 は Raspberry Pi 2+ でサポートされています。 Pi Zero または ARMv6 チップを使用するその他のデバイスではサポートされていません。 .NET Core には、ARM Cortex-A53 などの ARMv7 または ARMv8 チップが必要です。 Azure IoT Edge チームのメンバーは、.NET Core Bionic ARM32 Docker イメージを使用して、Edge デバイスで C# を作成する開発者をサポートしています。

Raspberry Pi で .NET Core を実行するには、2 つの方法があります。

ワン、使用 ドッカー . これは文字通り、Pi で .NET Core を起動して実行するための最も速くて簡単な方法です。クレイジーに聞こえるかもしれませんが、Raspberry Pi は素晴らしい Docker コンテナ対応システムです。本当に数分でできます。 Raspberry Pi に Docker をすばやくインストールするには:

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

Docker をインストールしたら、ログインとログアウトを行います。簡単なサンプルを試して、.NET Core が確実に動作することを確認してください。 https://hub.docker.com/r/microsoft/dotnet/tags/ で利用可能な Docker タグを調べることができます。また、https://github.com/dotnet/dotnet- で .NET Core Docker サンプルについて読むことができます。 docker/tree/master/samples/dotnetapp

これで、docker run を実行して "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

これは超クールです。私は Raspberry Pi (RPi) を使用しており、dotnet:2.1-sdk を要求するだけで、「マルチアーチ」docker ファイルを使用しているため、Docker は正しいことを行い、機能します。 Docker で ARM32 上の .NET Core を使用する場合は、次のタグのいずれかを使用できます。

注: 最初の 3 つのタグは マルチアーチ バイオニックはUbuntu 18.04です。コードネーム ストレッチは Debian 9 です。私は 2.1-sdk を使用しており、RPi で動作していますが、必要に応じて具体的に言うことができます。

  • 2.1 SDK
  • 2.1 ランタイム
  • 2.1-aspnetcore-ランタイム
  • 2.1-sdk-stretch-arm32v7
  • 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

次のように数分で試してみてください:

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

画像をダウンロードしています...

以前のバージョンの .NET Core の Dockerfile では、ARM で x64 イメージを実行していると失敗していました:

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

プロセッサーが違う!しかし、Microsoft の https://github.com/dotnet/announcements/issues/14 Kendra による multiarch では、2.1 で動作します。

<ブロック引用>

Docker には、microsoft/dotnet-nightly が最近利用し始めたマルチ アーキテクチャ機能があります。これをまもなく公式の microsoft/dotnet リポジトリに移植する予定です。マルチアーキテクチャ機能により、単一のタグを複数のマシン構成で使用できます。この機能がないと、アーキテクチャ/OS/プラットフォームごとに一意のタグが必要になります。たとえば、microsoft/dotnet:1.0-runtime タグは Debian に基づいており、Nano Server に基づいている場合は microsoft/dotnet:1.0-runtime-nanoserver に基づいています。マルチアーキテクチャでは、共通の microsoft/dotnet:1.0-runtime タグが 1 つあります。そのタグを 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 run" を行うのではなく、"dotnet build" を実行してから "dotnet exec" を実行します。これは非常に高速です。

Docker と .NET Core をやろうとしているのなら、これらのリソースがどれほど役立つかはいくら強調してもしすぎることはありません https://github.com/dotnet/dotnet-docker .

Docker を使用した .NET Core アプリの構築

  • .NET Core Docker サンプル - このサンプルは、サンプルをビルド、テスト、および実行します。複数のプロジェクトを含めてビルドします。
  • ASP.NET Core Docker サンプル - このサンプルでは、​​ASP.NET Core Web アプリで Docker を使用する方法を示します。

コンテナーで .NET Core アプリを開発する

  • .NET Core アプリケーションの開発 - このサンプルでは、​​.NET Core SDK をインストールせずに、Docker を使用して .NET Core アプリケーションを開発、ビルド、およびテストする方法を示します。
  • ASP.NET Core アプリケーションの開発 - このサンプルでは、​​.NET Core SDK をインストールせずに、Docker を使用して ASP.NET Core アプリケーションを開発およびテストする方法を示します。

コンテナ サイズの最適化

  • .NET Core Alpine Docker サンプル - このサンプルは、Alpine を使用してアプリケーションをビルド、テスト、実行します。
  • .NET Core 自己完結型サンプル - このサンプルは、アプリケーションを自己完結型アプリケーションとしてビルドおよび実行します。

ARM32 / ラズベリーパイ

  • .NET Core ARM32 Docker サンプル - このサンプルは、ARM32 上の Debian でアプリケーションをビルドして実行します (Raspberry Pi で動作します)。
  • ASP.NET Core ARM32 Docker サンプル - このサンプルは、ARM32 上の Debian で ASP.NET Core アプリケーションをビルドして実行します (Raspberry Pi で動作します)。

サンプルは非常に便利であることがわかりました...Dockerfiles 自体を掘り下げて、独自のファイルを構造化する方法について多くの洞察を得ることができます。 RPi のような小さなデバイスでビルドする場合、Multistage Dockerfiles を実行できることは非常に重要です。できる限り少ない作業を行い、Docker が内部の「スマート」を使用してできるだけ多くのレイヤーをキャッシュできるようにする必要があります。これをよく考えないと、ビルドごとにイメージ レイヤーをビルドするのに 10 倍の時間を無駄にすることになります。

実際の ASP.NET Core サイトをテストで 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 build」ができるようになりました。私のラズベリーパイで。復元、テスト、およびビルドします。テストが失敗すると、Docker ビルドは失敗します。

そこに「testrunner」と呼ばれる追加のセクションがあり、その後に「test?」があることを確認してください。そのテストランナー セクションはノーオペレーションです。 ENTRYPOINT を設定しますが、まだ使用されていません。 ENTRYPOINT は、Dockerfile の最後の行である場合、暗黙的に実行されます。 そこにあるので、必要に応じて「実行」できます。

このようにビルドして実行するだけです:

docker build -t podcast .
docker run --rm -it -p 8000:80 podcast
<ブロック引用>

注/落とし穴: 「ランタイム」イメージは、microsoft/dotnet:2.1-runtime ではなく、microsoft/dotnet:2.1-aspnetcore-runtime であることに注意してください。その aspnetcore 1 には、ASP.NET アプリを実行するために必要なバイナリが事前に含まれているため、"」私の csproj で。 aspnetcore-runtime ベース イメージを使用しなかった場合は、必要なすべての ASP.NET Core パッケージを手動で取り込む必要があります。ベース イメージを使用すると、生成されるイメージ ファイルが大きくなる可能性がありますが、これは利便性とサイズのバランスです。それはあなた次第です。必要なパッケージだけを手動で含めるか、便宜上 "Microsoft.AspNetCore.App" メタ パッケージを取り込むことができます。私の出来上がった「ポッドキャスト」画像は最終的に 205 メガでしたので悪くはありませんが、もちろん必要に応じてさまざまな方法でトリミングできます.

または、Docker からのテスト結果だけが必要な場合は、これを行うことができます!つまり、Docker コンテナーでテストを実行し、Linux コンテナーと (理論上の) Window ホストの間にボリュームをマウントして、結果の .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 コンテナ内で実行されたテストのテスト結果です:

これが結果です。わずか 1 時間の作業 (Dockerfile の作成) で、ARM32 Raspberry Pi 3 上の Docker でポッドキャスト Web サイトを実行できるようになりました。

2 番目 ――ここまでたどり着いたのですか? - .NET Core 2.1 SDK を "オン ザ メタル" にインストールするだけです。 Docker は必要ありません。tar.gz を入手してセットアップするだけです。 RPi ARM32v7 Dockerfile を見ると、このようにメタルにインストールできます。注:.NET Core SDK *および* ASP.NET Core 共有ランタイムを取得しています。最終リリース ビルドでは、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

勝利のためのクロスプラットフォーム!

スポンサー :JetBrains Rider:クロスプラットフォームの .NET IDE を確認してください。 ASP.NET、.NET Framework、.NET Core、Xamarin、または Unity アプリケーションを編集、リファクタリング、テスト、およびデバッグします。詳細を確認し、30 日間の試用版をダウンロードしてください!


Docker
  1. DockerでのPostgreSQLの実行、クイックで実用的なガイド

  2. .NET Core アプリが Docker コンテナーで実行され、XUnit で SkippableFacts が実行されていることを検出する

  3. GoDaddys の最も安価な共有 Linux ホスティングで ASP.NET Core を実行する - 自宅で試してはいけない

  1. RaspberryPiにDockerをインストールする方法

  2. ASP.NET Core Docker イメージ サイズの最適化

  3. 自己完結型の ASP.NET Core アプリケーションを Ubuntu で実行する

  1. Raspberry Piの基本:Raspbianをインストールして起動して実行する

  2. Dockerパート4:カスタムDockerイメージの構築と公開

  3. .NET Core と Docker および Microsoft Container Registry の概要