JupyterHubのDockerSpawnerで起動するイメージを替える

2021.10.12

データアナリティクス事業本部の鈴木です。

今回は、JupyterHubのDockerSpawnerで起動するイメージを替える方法を紹介します。

DockerSpawnerとは

DockerSpawnerは、JupyterHub Docker Spawnerの一つで、JupyterHubで認証されたユーザーを受け取り、そのユーザーのためにDockerコンテナ内にノートブックサーバーをspawnします。

JupyterHub Docker Spawner

コンテナとしては、例えば、Jupyter Docker Stacksのイメージを起動することができます。イメージにインストールされていないPythonのモジュールなどは自分でDockerfileを書くなどしてインストールする必要があるものの、Python・R・JuliaなどのインストールやJupyterLab環境の構築が不要になり、かなり楽にデータ分析環境の構築ができます。

Running a Container Using JupyterHub — docker-stacks latest documentation

Jupyter Docker Stacksのイメージで新しいものや、ライブラリを追加したイメージを起動したくなった場合は、JupyterHubの設定ファイルを修正することで簡単に替えることができますが、この記事では具体的にどのような手順になるのか確認します。

前提

環境

  • macOS Catalina バージョン10.15.7
  • JupyterHub 1.4.2
  • DockerSpawner 12.1.0
  • Docker version 20.10.7

変更前の状況の確認

既にJupyterHubの環境が構築済みで、DockerSpawnerからjupyter/datascience-notebookのあるタグのイメージを起動するよう設定されているとします。

以下はJupyterHubが読み込む設定ファイルであるjupyterhub_config.pyの該当箇所の抜粋です。

jupyterhub_config.pyの該当箇所

# 抜粋
c.DockerSpawner.image = 'jupyter/datascience-notebook:2021-10-07'

イメージはc.DockerSpawner.imageに設定します。詳しくはDockerSpawner APIドキュメントをご確認ください。

例えばPlotlyを使いたいとき、このイメージにはPlotlyが入っていないので、そのままだとimportできません。コンテナを起動した際にpipでインストールするか、インストール済みのイメージを作る必要があります。

Plotlyは未インストール

やってみる

差し替えるイメージをビルドする

jupyter/datascience-notebookをベースに、追加したいライブラリをインストールしたイメージをビルドします。

ビルドの手順を簡単に確認します。 手順の細かい説明は以下の記事に記載しましたので、併わせてご確認ください。

Jupyter Docker Stacksのコンテナをカスタマイズする | DevelopersIO

まず、requirements.txtを作成します。

requirements.txt

plotly == 5.3.1

次にDockerfileを作成します。

Dockerfile

FROM jupyter/datascience-notebook:2021-10-07
# 追加モジュールのインストール
COPY --chown=${NB_UID}:${NB_GID} requirements.txt /tmp/
RUN pip install --quiet --no-cache-dir --requirement /tmp/requirements.txt && \
    fix-permissions "${CONDA_DIR}" && \
    fix-permissions "/home/${NB_USER}"

WORKDIR "${HOME}"

Dockerfileとrequirements.txtがあるディレクトリでdocker buildを実行します。 イメージの名前とタグは分かりやすいものにしておきます。

docker build --rm -t nayuts/my-datascience-notebook:2021-10-07 .

念のため、イメージができているかdocker imagesで確認しておきましょう。

docker images
# REPOSITORY                                 TAG               IMAGE ID       CREATED              SIZE
# nayuts/my-datascience-notebook             2021-10-07            xxxxxxxxxxxx   About a minute ago   4.18GB

jupyterhub_config.pyの起動するイメージの指定を修正する

jupyterhub_config.pyのc.DockerSpawner.imageで指定しているイメージを、先ほどビルドしたイメージに修正します。

jupyterhub_config.pyの該当箇所

# 抜粋
c.DockerSpawner.image = 'nayuts/my-datascience-notebook:2021-10-07'

JupyterHubを再起動する

jupyterhub_config.pyをリロードするために、JupyterHubを再起動します。

なお、リロードのためにJupyterHubの再起動が必要であることは、以下のIssueを参考にしました。

Does Jupyterhub live reload the config file if it changes on disk? · Issue #2541 · jupyterhub/jupyterhub

/hub/homeなどに移動し、Adminボタンを押してAdmin画面に移動します。Shutdown Hubボタンでサーバーをシャットダウンします。

シャットダウン方法1

シャットダウン方法2

シャットダウンが確認できたら、再度JupyterHubを起動します。

jupyterhub -f jupyterhub_config.py

イメージが替わっていることを確認する

JupyterHubにログインして、コンテナを起動し、Plotlyが使用できることを確認します。

Plotlyの5.3.1がインストールされており、正常に散布図が描けることも確認できました。 新しいイメージに変わったことの確認

最後に

今回は、JupyterHubのDockerSpawnerで起動するイメージを替える方法を確認しました。

JupyterHubの設定ファイルを修正する必要はありますが、新しいイメージを作成し、JupyterHubが起動時に読み込む設定ファイルのc.DockerSpawner.imageを修正するだけで、起動するイメージを切り替えることができました。