.NET Core RC2が、Ubuntu 14.04には対応しているが、Ubuntu 16.04にはまだ対応しておらず、自分のノートPCはもう16.04にあげてしまったため、なんとかDockerの力を借りて動かせないかと試行錯誤したところ、動かすことに成功した。
このノウハウは他にも使えると思いました。
PATHの通ったところに、dotnet
というファイル名で以下のファイルをおいた。
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は便利っすね!
(追記)タイトルを、コマンドラインツールとしてのDockerから、今のタイトルに変えました。