Simple vscode project for development python and jupyter notebook in docker. This repositry uses Jupyter Docker Stacks.
Install Extensino for Visual Studio Code. Remote - Containers - Visual Studio Marketplace
clone this repository
- Press Ctrl+Shift+p to open Command Palette in Visual Studo Code.
- Exec
Remote-Containers: rebuild and Reopen in Container
- wait until docker-compose build and VSCode open work space
新しいモジュールをインストールしたり、ファイル操作やapt-get
などbash
を操作したい場合があると思う。その場合はdocker exec -it コンテナID /bin/bash
などすれば、bash
を起動できる。またはVS code
でRemote - container
している場合は新しくターミナルを開けばいい。
jupyter/minimal-notebook
やjupyter/scipy-notebook
など Jupyter Docker StacksのシリーズのDockerは立ち上がると同時にデフォルトでstart-notebook.sh
が走り、各種設定を行う。(GRAT_SUDOの有効化など)。start-notebook.sh
が必要な設定を行うのでデフォルトコマンドは変更しないほうがいい。
Jupyter Docker Stacksは2022年1月ごろ、デフォルトのサーバーバックエンドをjupyter notebookからjupyter serverに切り替えました。これに伴いデフォルトのエディタがjupyter notebookからjupyter Labに切り替わりました。
バックエンドがjupyter serverのままでも、jupyter notebookは引き続き使えます。loacalhost:8888
にアクセスすると、jupyter lab
に、loacalhost:8888/tree
にアクセスすると、従来のjupyter notebook
にアクセスします。
しかし、様々な拡張機能があるjupyter_contrib_nbextensionsはjupyter notebookでしか使えず、しかもバックエンドがjupyter serverだと/tree
のnotebookからもnbextensionは使えなくなってしまいます。私は選択中の文字を強調するHighlit Selected Word
を使いたいため、jupyter notebook+jupyter_contrib_nbextensionsを使い続けています。いまのところ同じ機能はjupyter labは対応していないようです。
なのでバックエンドをjupyter notebookに切り替える必要があります。
Common Features — Docker Stacks documentationによるとコンテナ内の環境変数DOCKER_STACKS_JUPYTER_CMD
をnotebook
に設定することで、立ち上がったサーバのバックエンドjupyter notebookに切り替えることができます。なので、docker-compose.yml
中で次のように設定しています。
environment:
- DOCKER_STACKS_JUPYTER_CMD=notebook
ユーザーは管理者であるroot
と、jovyan
がいる。jupyter notebook
を管理者権限で実行するのはセキュリティ的にまずいので、jupyter notebook
はjovyan
で起動するようになっている。
普通に立ち上げるとユーザーはjovyan
になる。権限がないのでapt-get update
やapt-get install
はできない。
しかしDockerfile
中で
USER root
とroot
に切り替えた場合、bash
はroot
で起動し、apt-get
などが使えるようになる。
この状態で、su jovyan
などとすれば、jovyan
に切り替わる。このjovyan
では/opt/conda/bin/
のパスが通っていないため、pip
コマンドやconda
コマンドが使えない。export PATH=$PATH:/opt/conda/bin
などとして、環境変数のPATH
に/opt/conda/bin/
を加えれば、pip
コマンドやconda
コマンドが使えるようになる。
またDockerfile中でroot
に切り替え、bash
はroot
で起動するようにした上で、docker-compose.yml
で、
- GRANT_SUDO=yes
としていれば、jovyan
もsudo
が使えるようになる。
つまりGRANT_SUDO=yes
かつUSER root
ならjovyan
はsudo
を使えるということ
https://jupyter-docker-stacks.readthedocs.io/en/latest/using/recipes.html
参照
conda install
やpip install
はroot
とjovyan
どちらのユーザーで実行しても、Python
のプログラミングには問題ないように思える。
しかし唯一jupyter_contrib_nbextensions
のインストールはjovyan
で行ったほうがいい。
root
でconda install -y jupyter_contrib_nbextensions
としてしまうと、nbextensions
関連のファイルがroot
権限になってしまい、jupyter
起動ユーザーがjovyan
なため、jupyter
上にnbextensions
のタブが現れても、どのエクステンションを有効にして書き換えても実際は権限の問題で書き換わらずに、F5で更新すると無効になってしまう。
だからjupyter_contrib_nbextensions
のインストールはDockerfile
内jovyan
ユーザーで予めやっておく。
RUN conda install -y jupyter_contrib_nbextensions
詳しくは jupyter notebookが使えるdockerにnbextensionsが導入できない
参照