ひとりAdvent Calendar 12日目です。
今日は手元でビルトした.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を含んでいないためだと思われます。メタパッケージについてはこちらのページを参考にしてください。
なんで含むことができないかというと、Microsoft以外のベンダーが.NET Coreの実行環境をビルドするためのsource-buildというオープンソースなリポジトリにこのRuntimeバイナリを生成する処理を含んでいないかららしく、issueが出ています。
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
生成されたイメージからアプリを作成します。
$ oc new-app mywebapp
Gitにpushしただけでアプリのイメージを作れるs2iも便利ですが、Binary Artifactsという方法もあるよというご紹介でした。