docker で jupyter/minimal-notebook が起動しない時

docker でOverlayFSを使っている環境で起こった話です。
自分で調査したわけではないのだが、興味深いことがあったので、記事にしてみました。

# 概要

xfs の上にOverlayFS を使っているときに、
docker で [jupyter/minimal-notebook](https://hub.docker.com/r/jupyter/minimal-notebook/) の最近のバージョン(a249876881d3)が起動できないことがあった。

その後の調査で ext4 の上に OverlayFS でも同様に起動ができなかった

```
docker run --rm -ti -u root -v $HOME/work:/home/jovyan/work --name jupyter_test -e NB_UID=10001 jupyter/minimal-notebook:a249876881d3
```

## AUFSではどうなのか？

以前docker-machineで作ったaufs環境があったので、試してみると同様のエラーがでた。
詳しくは調べていないが、ある時点でのaufsにも問題があるのかもしれない（すでに治っているかなどもまだ調査していない）



# 結論

* [Fix permissions when host mounting SSL cert/key · jupyter/docker-stacks@b7353bf](https://github.com/jupyter/docker-stacks/commit/b7353bf7596119c9e532d39136a6658d667bc782)

jupyter/docker-stacks上のこのコミットとOverlayFSの組み合わせが問題ではないかと考えている。

とすると、[base-notebook](https://github.com/jupyter/docker-stacks/tree/master/base-notebook) に対するものなので、docker でOverlayFSを利用している環境では、jupyterの他のイメージも同様の問題がおこる可能性がある。

# 回避策

以下の方法で回避できる

- jupyterの少し前のバージョン(8015c88c4b11)を使う
- docker run するときにNB_UIDを指定しない
- OverlayFS(aufs) をやめてdevicemapper など、他のグラフドライバにしてみる。
- 以下の２つのパッチをあてる
 - [ovl: ignore permissions on underlying lookup · torvalds/linux@38b78a5](https://github.com/torvalds/linux/commit/38b78a5f18584db6fa7441e0f4531b283b0e6725)
 - [vfs: add lookup_hash() helper · torvalds/linux@3c9fe8c](https://github.com/torvalds/linux/commit/3c9fe8cdff1b889a059a30d22f130372f2b3885f)
- カーネルを4.6.0以降にする
 - (今のところ4.5系や4.4stable系には取り込まれていないとのこと)

# 原因

xfsでも、ext4でも起こるところから、OverlayFSに問題があると考えている。

* [ovl: ignore permissions on underlying lookup · torvalds/linux@38b78a5](https://github.com/torvalds/linux/commit/38b78a5f18584db6fa7441e0f4531b283b0e6725)


# エラー

起動すると以下のようなメッセージがでる。

```
Traceback (most recent call last):
  File "/opt/conda/lib/python3.5/site-packages/traitlets/traitlets.py", line 501, in get
    value = obj._trait_values[self.name]
KeyError: 'runtime_dir'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/conda/bin/jupyter-notebook", line 6, in <module>
    sys.exit(main())
  File "/opt/conda/lib/python3.5/site-packages/jupyter_core/application.py", line 267, in launch_instance
    return super(JupyterApp, cls).launch_instance(argv=argv, **kwargs)
  File "/opt/conda/lib/python3.5/site-packages/traitlets/config/application.py", line 595, in launch_instance
    app.initialize(argv)
  File "<decorator-gen-7>", line 2, in initialize
  File "/opt/conda/lib/python3.5/site-packages/traitlets/config/application.py", line 74, in catch_config_error
    return method(app, *args, **kwargs)
  File "/opt/conda/lib/python3.5/site-packages/notebook/notebookapp.py", line 1058, in initialize
    self.init_configurables()
  File "/opt/conda/lib/python3.5/site-packages/notebook/notebookapp.py", line 838, in init_configurables
    connection_dir=self.runtime_dir,
  File "/opt/conda/lib/python3.5/site-packages/traitlets/traitlets.py", line 529, in __get__
    return self.get(obj, cls)
  File "/opt/conda/lib/python3.5/site-packages/traitlets/traitlets.py", line 508, in get
    value = self._validate(obj, dynamic_default())
  File "/opt/conda/lib/python3.5/site-packages/jupyter_core/application.py", line 99, in _runtime_dir_default
    ensure_dir_exists(rd, mode=0o700)
  File "/opt/conda/lib/python3.5/site-packages/ipython_genutils/path.py", line 167, in ensure_dir_exists
    os.makedirs(path, mode=mode)
  File "/opt/conda/lib/python3.5/os.py", line 241, in makedirs
    mkdir(name, mode)
PermissionError: [Errno 13] Permission denied: '/home/jovyan/.local/share/jupyter/runtime'
```

### 追記2016-06-17 Docker for Mac(beta)でも起きるようです。

自分で確認したのではないが、
Docker for Mac(beta)環境でもおこるようです。