.NET Core RC2が、Ubuntu 14.04には対応しているが、Ubuntu 16.04にはまだ対応しておらず、自分のノートPCはもう16.04にあげてしまったため、なんとかDockerの力を借りて動かせないかと試行錯誤したところ、動かすことに成功した。 このノウハウは他にも使えると思いました。
PATHの通ったところに、dotnetというファイル名で以下のファイルをおいた。
#!/bin/bash
docker run -it --rm \
-u $UID:`id -g` \
-v $HOME:$HOME \
-e "HOME=$HOME" \
--workdir=`pwd` \
--entrypoint=dotnet \
microsoft/dotnet:1.0.0-preview1 \
$*
ポイントは以下の通り。
- このコンテナの中に動かしたいプログラムが入っている(今回は
dotnet) docker run -it --rmにより、実行後すぐにコンテナを削除し、コンテナを残さないようにする-u $UID:`id -g`により、コンテナ内でもホストのユーザID、グループIDで実行できる(しないとroot権限になる)-v $HOME:$HOMEにより、コンテナ内にホストのホームディレクトリがそのままマウントされ、使える-e "HOME=$HOME"により、ホームディレクトリを認識させる(コンテナ内でexport HOME=/home/74th/した効果)--workdir=`pwd`により、カレントディレクトリで実行させる。ホームディレクトリをまるごとマウントしているため、そのディレクトリが存在している状態になる。--entrypoint=dotnetにより、コンテナ実行時に動かしたいプログラムを指定する- 最後の
$*により、このシェルスクリプトの引数をそのままdocker内のコマンドに渡す
これにより、.NET Coreのプロジェクトを以下のようにビルド、実行できる。
$ dotnet restore $ dotnet build
前にも同じことをしていたが、以下の問題があった。
- dockerコンテナ内はroot権限で実行されるため、docker内で作成したファイルなどの権限がrootになってしまう
- ホームディレクトリ上の設定ファイルを参照するプログラム(dotnetでは
$HOME/.nuget/を使う)では、そのユーザのホームディレクトリがないため、うまく動かない
こうやって小さく使っても、やっぱりdockerは便利っすね!