ASP.NET Core MVC アプリケーションの Docker コンテナを Heroku で動かしてみた

以前、最小の ASP.NET Core アプリケーションの Docker コンテナを Heroku で動かせた。

ただ、ASP.NET Core MVC アプリケーションでは、Heroku 上で NuGet パッケージの復元を実行しようとしていて失敗。

NuGet パッケージの復元で失敗するのなら、復元の必要が無いように、発行したアプリから Docker イメージを作ってしまえばいいかもしれない。

再挑戦してみる。

Heroku CLI をインストール

新しい MacBook Pro に Heroku CLI が入ってなかったので、Homebrew でインストールする。

brew install heroku/brew/heroku

Heroku にログイン

heroku login
heroku container:login

ASP.NET Core MVC プロジェクトを作成

最小の ASP.NET Core MVC アプリケーションの Docker イメージを作りたいので、dotnet new コマンドで生成された雛形をそのまま使う。

mkdir HelloAspNetCore
cd HelloAspNetCore
dotnet new mvc

ASP.NET Core MVC プロジェクトを発行

dotnet publish -c Release

を実行すると、./bin/release/netcoreapp2.0/ 下に実行に必要なファイルがすべて出力される。

Docker ファイルを作成

ファイル一式が出力されたディレクトリに Docker ファイルを作成する。

cd ./bin/release/netcoreapp2.0/publish

ディレクトリの中身をコピーして、ASP.NET Core アプリケーションを起動する Docker ファイルを書く。 ポートは Heroku から環境変数で渡される値を使う。

FROM microsoft/aspnetcore

WORKDIR /app

COPY . .

CMD ASPNETCORE_URLS=http://*:$PORT dotnet HelloAspNetCore.dll

Docker イメージを作成

docker build -t <イメージ名> .

Docker イメージに Heroku 用のタグを設定

Heroku アプリは事前に作成しておいたものを使っておく。

docker tag <イメージ名> registry.heroku.com/<Heroku アプリ名>/web

Heroku にデプロイ

Heroku が用意したレジストリにプッシュすると、Heroku 上で実行される。

docker push registry.heroku.com/<Heroku アプリ名>/web

確認

Web ブラウザでアプリの URL にアクセスすると、今回はちゃんとおなじみのページを表示できた。

f:id:griefworker:20180114061917p:plain

ASP.NET Core MVC アプリケーションの Docker コンテナを Heroku で動かすのはこの方法で良さそうだ。次の課題は Heroku Postgres の利用だな。