Jupyter Notebook on DockerでVim keybindsを利用する

  • 13
    いいね
  • 0
    コメント

3行まとめ

  • $(jupyter --data-dir)../../$(jupyter --config-dir)/nbconfigをvolumeとして永続化・マウント
  • lambdalisue/jupyter-vim-bindingを配置
  • $(jupyter --config-dir)/nbconfig/notebook.jsonvim_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