Visual Studio for Mac で ASP.NET Core アプリの Docker 統合を使ってみる
以下のドキュメントの VS for Mac の Docker統合がいつの間にかstableで使えるようになっていたので試してみました。
また、この方法を使うことで High Sierra 10.13.4 でSqlClientでOpenするとコケる問題も一応回避できます。
- ASP.NET Core Web アプリのプロジェクト作成
- 実行
- Docker 対応
- docker-compose で実行
- wwwrootをホストと共有する
- docker-compose down 用のスクリプトを作成
- まとめ
ASP.NET Core Web アプリのプロジェクト作成
この中なら何でも良いと思いますが、試しやすいRazorPagesのテンプレートを使います。
実行
そのまま実行するとブラウザにこんなページが表示されます。
Docker 対応
プロジェクト右クリック→追加→Dockerサポートの追加 を選択します。 この時すでにプロジェクト配下にDockerfileが存在するとグレーアウトになって選択できないので、その場合は一旦退避させるなどしましょう。
Dockerfileやdocker-comopse.ymlなどの関連ファイルが追加されます。
デバッグ実行に「docker-compose」が選択できるようになります。 これで実行した場合はdocker内で実行されるようになり、通常のプロジェクトを選択して実行した場合は、ホスト上で実行できます。
docker-compose で実行
実行してみます。
はい、普通にコケます。
ERROR: for dockercompose12601423798767843788_dockernetcore_1 Cannot start service dockernetcore: b'Mounts denied: \r\nThe path /usr/local/share/dotnet/sdk/NuGetFallbackFolder\r\nis not shared from OS X
/usr/local/share/dotnet/sdk/NuGetFallbackFolder がshareされてないからマウントできなくて無理みたいなことが書いてある(多分)ので docker for mac のpreferencesを開いて設定します。
+を押して先ほどのPathを設定します。
追加したら Apply & Restartを押して docker for macを再起動します。
Docker running になったらまた実行してみます。
今度は無事完了して実行できました。 初回ビルドはイメージのダウンロードや構築に多少時間がかかります。
ポートは空きポートが適当に選択されるようです。
ちゃんとブレークポイントで止まります。
wwwrootをホストと共有する
.NET Core側のソースの修正だとビルドし直しが必要ですが、静的ファイル(cssやjs)の変更の度にビルドしなおすのは面倒なので、wwwrootはホストと共有させておきます。
docker-compose.ymlを以下のように変更します。
(DockerNetCoreはプロジェクト名です)
version: '3.4' services: dockernetcore: container_name: myapp image: dockernetcore build: context: . dockerfile: DockerNetCore/Dockerfile volumes: - ./DockerNetCore/wwwroot:/app/wwwroot:rw
この状態でデバッグ実行して、デバッグを停止せずに wwwroot/css/site.css を試しに修正します。
... a { font-size:40px !important; }
でブラウザをリロードすると
フォントの巨大化がちゃんと反映されています。
この設定はdockerのままホスティングする場合にも、サービスを止めずに静的部分を反映できるので便利です。
docker-compose down 用のスクリプトを作成
docker-compose をデバッグ実行すると docker-compose up をしてくれるのは良いんですがデバッグやめてもVS閉じても起動しっぱなしになるので、後始末用のスクリプトを作っておくと便利です。
#!/bin/sh cd `dirname $0` docker-compose -f ./docker-compose.yml -f ./docker-compose.override.yml -f ./obj/Docker/docker-compose.vs.debug.g.yml -p dockercompose12601423798767843788 --no-ansi down
これを docker-compose.yml と同じ場所に shutdown.sh とかで保存しておき、実行権限をつけて
./shutdown.sh
このように実行すると
Stopping mydb ... Stopping myapp ... Stopping mydb ... done Stopping myapp ... done Removing mydb ... Removing myapp ... Removing mydb ... done Removing myapp ... done Removing network dockercompose12601423798767843788_default
こんな感じで停止&削除してくてスッキリします。
最後の -p に続くパラメータはVSのビルドログに
Target DockerPrepareForLaunch: docker-compose -f "/Users/kamu/Projects/DockerNetCore/docker-compose.yml" -f "/Users/kamu/Projects/DockerNetCore/docker-compose.override.yml" -f "/Users/kamu/Projects/DockerNetCore/obj/Docker/docker-compose.vs.debug.g.yml" -p dockercompose12601423798767843788 --no-ansi up -d Creating network "dockercompose12601423798767843788_default" with the default driver Creating myapp ... Creating mydb ... Creating myapp ... done Creating mydb ... done
こんな感じで docker-compose up してるのが出てるのでここの文字列をコピペします。dockercomposexxxxxx_default の部分はPCが変わると別物になりそうな気がするので絶対パスのままでも良いと思います。その場合はgit管理からは外しといた方が良さそうですね。
まとめ
Docker統合機能は思ってた以上に簡単でした。File Sharingの設定は軽くはまりましたが…。
この機能によってMacでのASP.NET Core アプリの開発がかなり捗りそうな気がします。DBコンテナなどの他サービスも追加することで開発環境と本番環境の違いをあまり意識することなく開発できるのは良いですね。
この機能はマイクロソフトはもっとプッシュすべきだと思います。
MySQLコンテナの追加について書きました。