kamulog

xamarin.formsのネタなど

Visual Studio for Mac で ASP.NET Core アプリの Docker 統合を使ってみる

以下のドキュメントの VS for Mac の Docker統合がいつの間にかstableで使えるようになっていたので試してみました。

github.com

また、この方法を使うことで High Sierra 10.13.4 でSqlClientでOpenするとコケる問題も一応回避できます。

github.com

ASP.NET Core Web アプリのプロジェクト作成

この中なら何でも良いと思いますが、試しやすいRazorPagesのテンプレートを使います。

f:id:kamusoft:20180410134351p:plain

実行

そのまま実行するとブラウザにこんなページが表示されます。

f:id:kamusoft:20180410134406p:plain

Docker 対応

プロジェクト右クリック→追加→Dockerサポートの追加 を選択します。 この時すでにプロジェクト配下にDockerfileが存在するとグレーアウトになって選択できないので、その場合は一旦退避させるなどしましょう。

f:id:kamusoft:20180410134421p:plain

Dockerfileやdocker-comopse.ymlなどの関連ファイルが追加されます。

f:id:kamusoft:20180410134435p:plain

デバッグ実行に「docker-compose」が選択できるようになります。 これで実行した場合はdocker内で実行されるようになり、通常のプロジェクトを選択して実行した場合は、ホスト上で実行できます。

f:id:kamusoft:20180410134453p:plain

docker-compose で実行

実行してみます。

はい、普通にコケます。

f:id:kamusoft:20180410134511p:plain

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を開いて設定します。

f:id:kamusoft:20180410134526p:plain

+を押して先ほどのPathを設定します。

f:id:kamusoft:20180410134541p:plain

追加したら Apply & Restartを押して docker for macを再起動します。

Docker running になったらまた実行してみます。

今度は無事完了して実行できました。 初回ビルドはイメージのダウンロードや構築に多少時間がかかります。

f:id:kamusoft:20180410134558p:plain

ポートは空きポートが適当に選択されるようです。

f:id:kamusoft:20180410134612p:plain

ちゃんとブレークポイントで止まります。

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; }

でブラウザをリロードすると

f:id:kamusoft:20180410134630p:plain

フォントの巨大化がちゃんと反映されています。

この設定は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コンテナの追加について書きました。

kamusoft.hatenablog.jp