しばやん雑記

ASP.NET Core とメイドさんが大好きなフリーランスのプログラマーのブログ

Windows 10 で Process Isolation を使う時の注意点など

Docker Engine 18.09.1 と Windows 10 Version 1809 の組み合わせ時に Process Isolation *1 が使えるようになっています。Windows Server Containers は Hyper-V Containers より軽量なので助かります。

早速弄っていましたが、クライアント OS で使う場合にありがちな問題に当たったので、調べてメモとして残します。Windows Server で使う場合には問題になりにくいです。

Process と Hyper-V で ACL が異なる

例えば Nano Server を Process Isolation かつ Volume をマウントして起動してみます。

docker run --rm --isolation=process -v "C:\Users\shibayan\source\repos\AspNetCore:C:\AspNetCore" \
           -it mcr.microsoft.com/windows/nanoserver:1809 cmd

この時にマウントしたディレクトリを確認しようとすると、アクセスが拒否されます。

f:id:shiba-yan:20190208172133p:plain

Hyper-V を使った場合は問題なくアクセス出来るのに、Process の場合は拒否されるので割と悩んでいましたが、以下のドキュメントに答えが載っていました。

Hyper-V の場合は単純に RO / RW という制御しかされないみたいですが、Process の場合は NTFS の ACL が使われるので、コンテナ内の実行ユーザー次第でアクセスが出来ないという話でした。

特に Nano Server は 1709 から実行ユーザーが ContainerAdministrator から ContainerUser に変更されているため、マウントするファイルに権限を付けるか、実行ユーザーを変更する必要があります。*2

ドキュメントには Authenticated Users が載っていたので、とりあえず付けて試します。

f:id:shiba-yan:20190208173436p:plain

これでコンテナから再度アクセスしてみると、問題なくディレクトリを確認出来ました。

f:id:shiba-yan:20190208171523p:plain

通常はサーバー OS でこういった使い方はしないので、Windows 10 で使えるようになると似たような問題が他にも出てきそうな気がします。

ちなみに Server Core の場合は ContainerAdministrator で動いているのと、ACL に大体は Administrators が入っているので問題ないみたいです。

Visual Studio からは一部利用不可

Process Isolation で Nano Server を使った場合に ACL 周りで問題が発生するため、Visual Studio のコンテナサポートを使った ASP.NET Core アプリケーションの開発は行えなくなります。

イメージのビルドまでは問題なく行えますが、デバッグ実行では Visual Studio が User Profile 以下にあるファイルをマウントしようとするため、リモートデバッガのプロセスを起動できずに失敗します。

f:id:shiba-yan:20190208174937p:plain

ASP.NET アプリケーションの場合は Server Core を使うので、問題なく Process Isolation でもデバッグ実行が行えます。Docker Compose を使おうとしたり、ベースイメージが古かったりと罠が多いですが、Hyper-V よりは素早く起動してくれます。

Default Isolation を Process に変更する

今のところ Visual Studio には Isolation を設定する機能などはないので、Process Isolation を使う場合には Default 自体を変更しておく必要があります。

Docker Deamon の設定に exec-opts を追加するだけなので簡単です。

{
  "exec-opts": [
    "isolation=process"
  ]
}

Docker の設定から Advanced を選べば JSON を書けるようになっているので、以下のように追記します。

f:id:shiba-yan:20190121021001p:plain

これで設定を保存すると Default Isolation が hyperv から process に変わります。

f:id:shiba-yan:20190121020911p:plain

Default Isolation を Process にしていても LCOW は問題なく Hyper-V で動くので、Volume 周りの影響を受けない場合は Process を使うと素早くコンテナを実行出来るので便利です。

*1:Windows Server Containers と呼ばれているやつ

*2:Nano Server の ContainerAdministrator は将来的に削除される予定なので注意