🪐

Docker コンテナ上で立ち上げた Jupyter を VS Code から利用する

2022/06/02に公開

Docker コンテナ上で立ち上げた Jupyter を VS Code から利用するための手順をまとめた。

背景

ローカルマシン上で Jupyter を使用する場合、 pip や Conda などのパッケージ管理ツールを使ってホストにインストールすることもできるが、公式から提供されている Docker イメージを利用することもできる。これらのイメージにはデータサイエンスでよく用いられるパッケージが既にインストールされているため、自分はこのイメージからコンテナを立ち上げて、ブラウザ経由で Jupyter を使用している。

ただ生の Jupyter では自動補完の機能に物足りなさを感じることがあり、 VS Code の Jupyter Notebook サポートに頼ることにした。

手順

Docker コンテナを立ち上げる

次のような docker-composer.yml で Jupyter の Docker コンテナを立ち上げる。

docker-compose.yml
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 の拡張機能 PythonJupyter をコンテナ上で有効化する。
サイドメニューの拡張機能一覧の "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 を固定化しておくと便利。

docker-compose.yml
version: "3.9"
services:
  jupyter:
    ...
    command: start-notebook.sh --NotebookApp.token='572f499b135cf23e09bb78d356605fdc96b29ac6'

セルを実行しようとするとどのカーネルを使うか尋ねられるので、(コンテナ上の) /opt/conda/bin/python を指定する。

これでセル実行できるが、前述の通り外部パッケージの依存関係を解決できない。

脚注
  1. 自分の環境では Error loading preloads: Could not find renderer というエラーメッセージが表示されることがあったが、ウィンドウをリロードしたら直った。 ↩︎

Discussion