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