Dockerにホームディレクトリをマウントしちゃおう

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