銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

OpenShift で ASP.NET CoreアプリをBinary Artifactsとしてデプロイしてみる

ひとりAdvent Calendar 12日目です。

adventar.org

今日は手元でビルトした.NET CoreアプリのバイナリをアップロードしてOpenShiftにデプロイできるBinary Artifactsデプロイを試してみます。

Binary Artifactsデプロイ自体は.NET Core 2.1などでも動きますが、せっかくなので今回は.NET Core 2.2を使います。OpenShift 3.11のリリース後に.NET Core 2.2はリリースされているので、こちらの手順でイメージなどを更新します。

Chapter 2. Using .NET Core 2.2 on Red Hat OpenShift Container Platform - Red Hat Customer Portal

その後、Binary Artifactsのデプロイはこの手順で行います。

Chapter 2. Using .NET Core 2.2 on Red Hat OpenShift Container Platform - Red Hat Customer Portal

Binary Artifactsのデプロイと言っているのでは、実行可能なアプリのバイナリを、該当のアプリのRuntimeが入っているコンテナイメージを指定して、コンテナイメージ+アプリのバイナリな実行用コンテナイメージを生成する方法です。s2iといっているビルド方式は、OpenShift上でbuilder用のPodが起動されそのPodがgit repositoryからアプリのコードを取得し、Podの中でアプリをビルドして実行用のコンテナイメージを生成します。これに対し、Binary Artifactsでは外部でビルドし、その成果物だけ配置します。

Binary Builds - Tutorials | Developer Guide | OpenShift Container Platform 3.11

今回は手元でビルドするため、手元のRHEL Serverに.NET Core 2.2をインストールしておく必要があります。

さて、ASP.NET Coreの実行用バイナリを生成するためにpublishコマンドを実行しますが、MicrosoftNETPlatformLibrary=Microsoft.NETCore.Appという見慣れないプロパティを指定しています。

$ dotnet publish -c Release /p:MicrosoftNETPlatformLibrary=Microsoft.NETCore.App

これについてはドキュメントでも必ず指定するように記述があります。

Chapter 1. Using .NET Core 2.2 on Red Hat Enterprise Linux - Red Hat Customer Portal

なぜこの指定が必要かといいますと、Microsoft以外のベンダーが提供するASP.NET Coreの実行環境はメタパッケージのRuntimeを含んでいないためだと思われます。メタパッケージについてはこちらのページを参考にしてください。

docs.microsoft.com

なんで含むことができないかというと、Microsoft以外のベンダーが.NET Coreの実行環境をビルドするためのsource-buildというオープンソースなリポジトリにこのRuntimeバイナリを生成する処理を含んでいないかららしく、issueが出ています。

github.com

3.0で取り組むと言っているのでそれまで待ちましょう。

メタパッケージはないものの、実行はできるのでそのままデプロイをつづけます。

まずビルド定義を作ってから、そのビルド定義に手元のArtifactsを指定してビルドを開始します。Artifactsがアップロードされコンテナイメージが生成されます。

$ oc new-build --name=mywebapp dotnet:2.2 --binary=true

$ oc start-build mywebapp --from-dir=bin/Release/netcoreapp2.2/publish

f:id:tanaka733:20181210124955p:plain

生成されたイメージからアプリを作成します。

$ oc new-app mywebapp

f:id:tanaka733:20181210125149p:plain

f:id:tanaka733:20181210125202p:plain

Gitにpushしただけでアプリのイメージを作れるs2iも便利ですが、Binary Artifactsという方法もあるよというご紹介でした。