質問: ### jupyter notebookサーバになるdockerコンテナにnbextensions を導入したい いろんな環境でデータ分析できるようdockerコンテナをサーバにして、 そこにアクセスしてjupyter notebookを使いたいと考えています。 dockerのjupyter/datascience-notebookイメージでコンテナを作成していろいろいじっているのですが、 拡張機能のnbextensionsが導入できません ### 試したこと dockerコンテナを立ち上げたあと、 コンテナ上のbashでroot権限で ``` pip install jupyter-contrib-nbextensions pip install jupyter-nbextensions-configurator jupyter contrib nbextension install --user jupyter nbextensions_configurator enable --user ``` として再起動すると、jupyter上にnbextensionsのタブが現れるのですが どのエクステンションを有効にしても、F5で更新すると無効になってしまいます。 このdockerイメージのjupyter/datascience-notebookではjupyterがjovyanユーザーで動いているらしいので、 権限の問題だと思い、root権限でインストールするのではなく、jovyanユーザーでpipしてみると、 ``` su jovyan pip install jupyter-contrib-nbextensions bash: pip: command not found ``` となりコマンドが見つかりません。 (なぜpipコマンドもjupyterコマンドも動かないjovyanでjupyterが動いているのかもの謎なのですが) よろしくおねがいします。 ### 補足情報 OS:Windows 10 使用ソフト:docker for Windows (会社ではWindowsしか使えないのでWindows以外を使えという回答はなしでお願いします。)
回答: まだ挙動がよくわかっていない部分があるのですが、 解決方法を示します。 原因 == jupyte notebookでnbextensionsが使えるためにはnotebookを実行するユーザーのjovyanで `jupyter contrib nbextension install --user` とnbextensionsをインストール必要があると考えられます。 しかしjovyanはなぜか`pip`も`jupyter`コマンドも動かせません。 そこでrootで調べます。 ``` root@56cd00d75be2:~# which pip /opt/conda/bin/pip ``` とわかるので、`pip`は`/opt/conda/bin/`にあると分かりました。 さらにjovyanの環境変数のPATHを調べてみると、`/opt/conda/bin/`が入っていないことがわかりました。 そこで解決法として2つ考えられます PATHに`/opt/conda/bin/`を加える方法 単純に環境変数のPATHに`/opt/conda/bin/`を加えれば、`pip`も`jupyter`も動くようになります。 ``` jovyan@56cd00d75be2:~$ export PATH=$PATH:/opt/conda/bin ``` あるいは毎回`/opt/conda/bin/pip`とすればいいです。これで ``` jovyan@56cd00d75be2:~$ pip install jupyter-contrib-nbextensions jovyan@56cd00d75be2:~$ jupyter contrib nbextension install --user ``` とすればnbextensionsが使えるようになります。`/opt/conda`以下のディレクトリはjovyanが所有しているのでsudoは必要ないと思われます。もしうまく動かなかったら`sudo -H`で実行すればいいと思います。(jovyanで`sudo`するには`GRANT_SUDO=yes`とした環境変数を設定して`start-notebook.sh`をrootで実行する必要があります。jovyanで`sudo`が使える条件についてはリファレンスを参考にして下さい https://jupyter-docker-stacks.readthedocs.io/en/latest/using/common.html) イメージをビルドする段階(Dockerfile内)で、nbextensionsをでインストールする方法 =================================================== これはリファレンスに書いてあった方法です。 https://jupyter-docker-stacks.readthedocs.io/en/latest/using/recipes.html?highlight=nbextensions Dockerfile上の`RUN`コマンドで実行すれば、なぜか`pip`も使えます。 ``` ... USER jovyan RUN pip install jupyter-contrib-nbextensions RUN jupyter contrib nbextension install --user ... ``` これでnbextensionsが使えるようになります。 これはDockerfileのRUNコマンドは実際にそのコンテナを立ち上げて実行しているのではなく、すぐ削除される別のintermediate container上でコマンドを実行していて、そのコンテナ上ではPATHに`/opt/conda/bin/`が入っているため`pip`が使えるのだと思われます。