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

はじめに

ASP.NET Core アプリケーションを Docker で動かすことができた。

tnakamura.hatenablog.com

そういえば、Heroku で任意の Docker コンテナを動かすことができるようになっていたな。 まだベータ版な上、制限もあるみたいだけど。

もしかしたら ASP.NET Core アプリケーションの Docker イメージを Heroku にデプロイして動かせるかも? やってみた。

いきなり結論

結論として Empty Web Application は動かすことができた。 Hello World を HTTP レスポンスのボディに書き込むだけのやつ。 ASP.NET Core MVC は動かせなかった。

なので、以下では Empty Web Application を動かした手順を書いていく。

Docker をインストール

Docker は正式版になったばかりの Docker for Mac を使う。

docs.docker.com

Empty Web Application を作成

yo でプロジェクトを新規作成する。

$ yo aspnet

     _-----_     ╭──────────────────────────╮
    |       |    │      Welcome to the      │
    |--(o)--|    │  marvellous ASP.NET Core │
   `---------´   │        generator!        │
    ( _´U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |
   __'.___.'__
 ´   `  |° ´ Y `

? What type of application do you want to create? Empty Web Application
? What's the name of your ASP.NET application? HelloAspNetCore
   create HelloAspNetCore/.gitignore
   create HelloAspNetCore/Program.cs
   create HelloAspNetCore/Startup.cs
   create HelloAspNetCore/project.json
   create HelloAspNetCore/web.config
   create HelloAspNetCore/Dockerfile
   create HelloAspNetCore/Properties/launchSettings.json
   create HelloAspNetCore/README.md


Your project is now created, you can use the following commands to get going
    cd "HelloAspNetCore"
    dotnet restore
    dotnet build (optional, build will also happen when it's run)
    dotnet run

生成された Dockerfile を修正

Heroku の Docker 対応はまだ制限があって、Dockerfile には CMD が必須。 また、ポートは Heroku が割り当てるやつを使わないといけない。

yo で生成したプロジェクトの Dockerfile を次のように修正した。

FROM microsoft/dotnet:latest

COPY . /app

WORKDIR /app

RUN dotnet restore

RUN dotnet build

#EXPOSE 5000/tcp

CMD dotnet run --server.urls http://0.0.0.0:$PORT

Heroku プラグインをインストール

heroku toolbelt をインストールしていなければ、インストールしておく。

toolbelt.heroku.com

heroku-container-registry プラグインを使う。

$ heroku plugins:install heroku-container-registry

Heroku にデプロイ

<app_name> には Heroku 上で作成したアプリケーション名を指定する。 自分はテスト用に作ったアプリケーションを使いまわすことが多いのもので。

$ heroku container:login
$ heroku container:push web --app <app_name>

を実行すると、Dockerfile をもとに Docker イメージが作成され、 それが Heroku の Docker レジストリにプッシュされているように見える。

$ heroku open --app <app_name>

でブラウザを起動すると、Hello world が表示された。

f:id:griefworker:20160824001313p:plain

ちなみに ASP.NET Core MVC

yo で ASP.NET Core MVC のプロジェクトを生成して、 同じように Dockerfile を修正してデプロイしてみたが、 アプリケーションの起動に失敗していた。

heroku logs でログを見たところ、NuGet パッケージのリストアで失敗していた模様。 パッケージを resolve できてないみたいだった。

Empty Web Application から1つずつパッケージを増やしていって、 どのパッケージが原因か特定しようとしたけど、 さすがに数が多くて時間切れ。

そもそも、なんでリストアが実行されたんだろう? NuGet パッケージダウンロード済みの Docker イメージをデプロイしたんじゃないのか? Docker の勉強が足りてないんで、自分のやり方が悪かった可能性も十分ある。

時間が空いたときに再挑戦、するかもしれない。