.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は便利っすね!