銀の光と碧い空

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

OpenShift で .NET Core 2.0を使いはじめる

先日、Red Hat版*1の.NET Core 2.0がリリースされました。

tech.tanaka733.net

Getting Started Guide - Red Hat Customer Portal

続いてOpenShiftでも利用可能なコンテナやテンプレートも提供されました。OpenShift本体のアップデートとは別ものとして、イメージやテンプレートの更新が提供されています。

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

というわけで実際に使ってみましょう。

まずは手順に従って、imagestreamを設定するのですが、最初は検証用のプロジェクトを作ってそのプロジェクトにimagestreamを作ってみましょう。

$ oc create -f https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/dotnet_imagestreams.json

複数のプロジェクトで共有できるようにするにはopenshift名前空間に作るのですが、おおくの場合で1.0のimagestreamが存在しているはずなのでreplaceします。

$ oc replace -n openshift -f https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/dotnet_imagestreams.json

これで.NET Core 2.0のコンテナイメージをimagestreamから参照できます。2.0のコンテナイメージからdotnet-runtimeという.NET Core SDK全部入りではなくて.NET Core のRuntimeのみがインストールされている軽量なコンテナが提供されています。

Container Catalog - Red Hat Customer Portal

Container Catalog - Red Hat Customer Portal

2.0-5の時点で全部入りが324.8 MBに対してRuntimeのみが227.1 MBなので100MBほど軽くなっています。このRuntimeを使ったテンプレートは最後に紹介します。

さて、imagestreamを作成もしくは更新しておくと新規にアプリケーションが作れます。ドキュメントにあるように、典型的にはこんなコマンドでアプリのGitリポジトリーのリンクと合わせて指定します。

$ oc new-app --name=exampleapp dotnet:2.0~https://github.com/redhat-developer/s2i-dotnetcore-ex#dotnetcore-2.0 --build-env DOTNET_STARTUP_PROJECT=app

OpenShiftではs2iという仕組みによりアプリのリポジトリを指定すると自動的にbuild用のコンテナが起動し、そのコンテナ内でリポジトリからのクローンとアプリのビルドが行われます。.NET Coreの場合build用のコンテナは先程の.NET Core SDK 全部入りのコンテナになります。基本的にはデフォルトの設定でいい感じにビルドできるようになっています。また.NET Core 1.xの時はリスニング用のポートの設定を記述しないといけなかったのですが、環境変数でデフォルトのポート8080を指定しているので、dotnet new mvcとdotnetコマンドで作成されるテンプレートのプロジェクトをなにも変更することなしにデプロイできるようになっています。

oc new-appコマンドで最低限のアプリは作れるのですが、実際に使われるアプリにより近い例としてアプリのテンプレートが用意されています。これも2.0対応したものを有効にします。imagestream同様まずはプロジェクト内に作成します。f:id:tanaka733:20170906165239p:plain

$ oc create -f https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/templates/dotnet-example.json
$ oc create -f https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/templates/dotnet-runtime-example.json
$ oc create -f https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/templates/dotnet-pgsql-persistent.json

プロジェクト間で共有するには同様にopenshift名前空間に作るのですが、既存のテンプレートがあるかもしれないので、createとreplaceを両方実行してしまうのが手っ取り早いです。

$ oc create -n openshift -f https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/templates/dotnet-example.json
$ oc create -n openshift -f https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/templates/dotnet-runtime-example.json
$ oc create -n openshift -f https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/templates/dotnet-pgsql-persistent.json
$ oc replace -n openshift -f https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/templates/dotnet-example.json
$ oc replace -n openshift -f https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/templates/dotnet-runtime-example.json
$ oc replace -n openshift -f https://raw.githubusercontent.com/redhat-developer/s2i-dotnetcore/master/templates/dotnet-pgsql-persistent.json

テンプレートを追加すると、コマンドラインからも利用できますが、OpenShiftのWeb consoleからも参照できます。プロジェクトの画面から、Add to project>Browse catalogを選んで、.NET を選ぶと表示されます。

f:id:tanaka733:20170906165225p:plain f:id:tanaka733:20170906165207p:plain f:id:tanaka733:20170906165300p:plain

これで好きなテンプレートを選ぶと次のような画面が表示されます。

f:id:tanaka733:20170906165422p:plain

Try it outでサンプルリポジトリの値を入力してくれます。その場合はアプリ名だけいれればOKです。またより詳細な設定を行うこともできます。

f:id:tanaka733:20170906165434p:plain

これでアプリを作成すると、ビルド、デプロイが実行されてアプリのコンテナが起動してくるはずです。

さて、.NET Core 1.0のころからあったs2iでのビルドとテンプレートのアプリの場合、アプリケーションのコンテナは.NET Core SDKが入っている状態のコンテナにアプリのプロジェクト一式とビルド成果物を配置したものになります。ただ、アプリを実行するだけなのに.NET Core SDKが入っているのは重いだということで、.NET Core Runtimeだけが入ったコンテナが提供されました。そして、同じようにs2iでアプリのリポジトリだけを指定すれば最終的に、.NET Core Runtimeだけがはいったイメージにアプリのビルド成果物だけを加えたアプリのポッドを作るためのテンプレートがdotnet-runtime-exampleになります。

使い方は他のテンプレート同じく必要なパラメーターを入力すればよいです。実際にビルドする流れとしては、まずは以前からあるs2iのビルドを実行して、.NET Core SDK + アプリのコード + アプリのビルド成果物 が入っているコンテナを作ります。そして、もう一度ビルドを走らせて、そのコンテナ中で単純には次のDockerfileをビルドしてアプリのコンテナを作成します。

FROM dotnet-runtime:..
ADD app.tar.gz .

アプリのビルド成果物のみをdotnet-runtimeイメージに追加したコンテナを作成するわけです。これでより軽量なアプリのコンテナを作成することができます。

*1:Red Hatのサポートが受けられる