Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

izumin5210
ʕ ◔ϖ◔ʔ < I'm a Rubyist.
https://blog.izum.in
wantedly
「シゴトでココロオドル」ためのビジネスSNS「Wantedly」の開発・運営をしています。
https://wantedlyinc.com/ja/presentations
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした