はじめに
ASP.NET Core アプリケーションを Docker で動かすことができた。
そういえば、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 を使う。
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 をインストールしていなければ、インストールしておく。
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 が表示された。
ちなみに ASP.NET Core MVC
yo で ASP.NET Core MVC のプロジェクトを生成して、 同じように Dockerfile を修正してデプロイしてみたが、 アプリケーションの起動に失敗していた。
heroku logs
でログを見たところ、NuGet パッケージのリストアで失敗していた模様。
パッケージを resolve できてないみたいだった。
Empty Web Application から1つずつパッケージを増やしていって、 どのパッケージが原因か特定しようとしたけど、 さすがに数が多くて時間切れ。
そもそも、なんでリストアが実行されたんだろう? NuGet パッケージダウンロード済みの Docker イメージをデプロイしたんじゃないのか? Docker の勉強が足りてないんで、自分のやり方が悪かった可能性も十分ある。
時間が空いたときに再挑戦、するかもしれない。