先日、Red Hat版*1の.NET Core 2.0がリリースされました。
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同様まずはプロジェクト内に作成します。
$ 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 を選ぶと表示されます。
これで好きなテンプレートを選ぶと次のような画面が表示されます。
Try it out
でサンプルリポジトリの値を入力してくれます。その場合はアプリ名だけいれればOKです。またより詳細な設定を行うこともできます。
これでアプリを作成すると、ビルド、デプロイが実行されてアプリのコンテナが起動してくるはずです。
さて、.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のサポートが受けられる