3行まとめ
$(jupyter –data-dir)../../と$(jupyter –config-dir)/nbconfigをvolumeとして永続化・マウント
lambdalisue/jupyter-vim-bindingを配置
$(jupyter –config-dir)/nbconfig/notebook.jsonでvim_binding読み込み
はじめに
本記事ではDockerコンテナで動作しているJupyter Notebook上で,vim_bindingを利用しVimのKeybindを有効にする方法について説明する.
Jupyter Notebookについて本記事では説明を省略する.その素晴らしさ,および使い方等については『現代のエンジニアのための強力なメモ帳 Jupyter notebookのすゝめ – クックパッド開発者ブログ』『Jupyter事始め – Qiita』等を参照ください.
Jupyter Notebook on Docker ?
Pythonに慣れていない人間にとって,Jupyter Notebookの環境を整えるのは意外と難しい.その手間を省くため,Docker imageを利用することで環境構築の手間を省くことがある(『Pythonista以外が環境を汚さずにJupyter Notebookに触れる方法 … – Qiita』)
また,機械学習やデータ解析の便利ツールがつまったDocker imageが提供されていることも多い(e.g. jupyter/datascience-notebook, tensorflow/tensorflow, etc.).
Vim keybind on Jupyter Notebook ?
一方,Web上でテキスト入力を行うとiiiijjjjddjkkkkiijjjkkpkkkiiijjjhhhhh:wqな我々Vimmerにとって,Jupyter Notebookを利用する際にはvim_bindingの有効化が必須となる(『Jupyter (旧 IPython notebook)の本来あるべき姿を垣間見る – Λlisue’s blog』).
しかし,Docker上で動作してるJupyter Notebookでこれらextensionを有効化させるためにはちょっとした工夫が必要となる.
Vim keybindings on Jupyter Notebook on Docker
方針としては簡単で, extensionsとその設定ファイル群をvolumeとして永続化してあげればいい.
以下の作業は基本的にすべてhostで行う(Dockerコンテナ起動前).
vim_bindingのclone
cloneでもいいしzip持ってきてもいいけど,あとで管理を楽にするためにここではsubmoduleとしてリポジトリに追加する.
$ git submodule add https://github.com/lambdalisue/jupyter-vim-binding .local/share/jupyter/nbextensions/vim_binding
vim_bindingの有効化
.jupyter/nbconfig/notebook.jsonに以下のような設定を記述(他にもextension使ったりする場合はよしなに).
{
"load_extensions": {
"vim_binding/vim_binding": true
}
}
volumeの設定
3ディレクトリ以上のvolumeを設定することになるので,docker-composeを利用する.
datascience-cv-notebook:
image: izumin5210/datascience-cv-notebook
ports:
- 8888:8888
volumes:
- ./notebooks:/notebooks
- ./.local:/home/jovyan/.local
- ./.jupyter/nbconfig:/home/jovyan/.jupyter/nbconfig
名前(最初のkey)とimageは必要に応じて変更する(ここでは datasience-notebbok + OpenCVなdatascience-cv-notebookを利用している).
ポイントはvolumesの部分.
./notebooks:/notebooks
保存したnotebookや利用するimageやデータファイル等を./notebbok以下に永続化
Jupyter公式が提供するDocker imageをベースに利用している場合はこれでOK
それ以外の場合は適宜変更
./.local:/home/jovyan/.local
$(jupyter –data-dir)/../../ => extensionsをcloneしてくるディレクトリ
Jupyter公式のImageではまだ作られていないディレクトリなので大きめにとってる
あとで.gitignoreをいい感じにして対応する
./.jupyter/nbconfig:/home/jovyan/.jupyter/nbconfig
$(jupyter –config-dir)/nbconfigにあたる
読み込むextensionの設定とか置くディレクトリ
.gitignoreの設定
前述の通り,.localをそのまま永続化しているため余計なファイルがいっぱい入ってくる.管理ファイルは少ないに越したことはないので,これをすべてignoreしておく.
!.local/share/jupyter
.local/share/jupyter/*
!.local/share/jupyter/nbextensions/
これで本当に管理しないといけないディレクトリ($(jupyter –data-dir)/nbextensions)以外をすべてignoreできる.はず.
Enjoy !
以下のコマンドでJupyterが起動する.datascience-cv-notebookの部分は自分が使いたいやつに変える.
$ docker-compose up datascience-cv-notebook
最終的なファイル構成
リポジトリのファイル構成はだいたい以下のような感じになる.
├── .gitignore
├── .gitmodules
├── .jupyter
│ └── nbconfig
│ └── notebook.json
├── .local
│ └── share
│ └── jupyter
│ └── nbextensions
│ └── vim_binding
├── Dockerfile
├── docker-compose.yml
└── notebooks
├── images
│ ├── ...
│ └── test0001.png
├── ...
└── awesome-notebook.ipynb
References
-
- lambdalisue/jupyter-vim-binding
-
- Jupyter (旧 IPython notebook)の本来あるべき姿を垣間見る – Λlisue’s blog
-
- Jupyter事始め – Qiita
-
- 現代のエンジニアのための強力なメモ帳 Jupyter notebookのすゝめ – クックパッド開発者ブログ
- Pythonista以外が環境を汚さずにJupyter Notebookに触れる方法 あるいは,Rubyist以外が環境を汚さずにJupyter NotebookでRubyに触れる方法 – Qiita