Docker コンテナ上で立ち上げた Jupyter を VS Code から利用する
Docker コンテナ上で立ち上げた Jupyter を VS Code から利用するための手順をまとめた。
背景
ローカルマシン上で Jupyter を使用する場合、 pip や Conda などのパッケージ管理ツールを使ってホストにインストールすることもできるが、公式から提供されている Docker イメージを利用することもできる。これらのイメージにはデータサイエンスでよく用いられるパッケージが既にインストールされているため、自分はこのイメージからコンテナを立ち上げて、ブラウザ経由で Jupyter を使用している。
ただ生の Jupyter では自動補完の機能に物足りなさを感じることがあり、 VS Code の Jupyter Notebook サポートに頼ることにした。
手順
Docker コンテナを立ち上げる
次のような docker-composer.yml
で Jupyter の Docker コンテナを立ち上げる。
version: "3.9"
services:
jupyter:
container_name: my-jupyter
image: jupyter/datascience-notebook:2021-11-10
ports:
- 8888:8888
environment:
- JUPYTER_ENABLE_LAB=yes
volumes:
- ${HOME}/Documents/:/home/jovyan/work
command: start-notebook.sh
今回の例では ${HOME}/Documents
以下すべてをコンテナにマウントしているが、通常はプロジェクトルートを指定すれば十分だろう。
拡張機能を使ってコンテナに接続する
VS Code の拡張機能 Dev Containers を追加する。
そしてコマンドパレットから "Dev Containers: Attach to Running Container..." を選択し、先ほど立ち上げたコンテナ "my-jupyter" を選択すると、新しくウィンドウが立ち上がる。
VS Code の拡張機能 Python と Jupyter をコンテナ上で有効化する。
サイドメニューの拡張機能一覧の "Install in Container jupyter/..." ボタンから、コンテナに拡張機能をインストールできる。
セルを実行しようとするとどのカーネルを使うか尋ねられるので、 /opt/conda/bin/python
を指定する。
実行結果が出力されれば成功 [1]。
まとめ
Docker コンテナ上で立ち上げた Jupyter を VS Code から利用するための手順をまとめた。
まだガッツリ使用している訳ではないので、設定や使用の方法について改善点があったら追記する予定。
おまけ: Docker コンテナ上のカーネルをホストから直接指定する方法(失敗)
VS Code の拡張機能 Jupyter を使って、ホストから Docker コンテナ上のカーネルを指定する方法も試した。これでもセル実行は可能だったが、コンテナ上で管理されている外部パッケージの依存関係はホストから直接参照できない(と思っている)ので、肝心の自動補完が効かないのだった。
一応、手順だけメモしておく。
手順
まずコマンドパレットから "Jupyter: Specify Jupyter server for connections" を選択して、さらに Existing を選択する。サーバーの URI の入力を求められるので、ローカルホストの Jupyter の URL を設定する。
このときクエリパラメータとして token を指定するが、コンテナを再作成する度に token の値が変わってしまうと不便なので、 Jupyter の起動コマンドのオプション経由で token を固定化しておくと便利。
version: "3.9"
services:
jupyter:
...
command: start-notebook.sh --NotebookApp.token='572f499b135cf23e09bb78d356605fdc96b29ac6'
セルを実行しようとするとどのカーネルを使うか尋ねられるので、(コンテナ上の) /opt/conda/bin/python
を指定する。
これでセル実行できるが、前述の通り外部パッケージの依存関係を解決できない。
-
自分の環境では
Error loading preloads: Could not find renderer
というエラーメッセージが表示されることがあったが、ウィンドウをリロードしたら直った。 ↩︎
Discussion