docker 容器中的 jupyterhub 无法连接到外部目录

jupyterhub in docker container not able to connect to external directory

我正在为我们组中的用户设置一个 jupyterhub,以便能够 运行 使用我们的 python 包处理公共数据的脚本,而无需在他们的计算机上安装环境。 该系统基于 jupyterhub-deploy-docker (https://github.com/jupyterhub/jupyterhub-deploy-docker/) with the modifications for running on a localhost (https://github.com/PHI-Toolkit/jupyterhub-deploy-docker-localhost),它从 docker 化的 jupyterhub 中生成具有单用户 jupyter notebook 实例的 Docker 容器。这个想法是将本地主机目录(或数据服务器的目录)挂载到 jupyterhub 容器中,并从那里将其提供给单个用户实例,用作 notebook_dir。然后ipynbs就可以访问服务器上的数据,并保存在那里。

整个方法在未 docker 化时运行良好(用于测试、使用 DummyAuthenticator 进行身份验证并使用 SimpleLocalProcessSpawner 生成),但我无法让 docker 容器查看主机目录。 我的做法是在宿主机上额外绑定路径,指定使用的DOCKER_NOTEBOOK_DIR作为目标。 因此,在 docker-compose.yml 中,我更改了卷部分

volumes:
  # Bind Docker socket on the host so we can connect to the daemon from
  # within the container
  - "/var/run/docker.sock:/var/run/docker.sock:rw"
  # Bind Docker volume on host for JupyterHub database and cookie secrets
  - "data:${DATA_VOLUME_CONTAINER}"
  - "/path/on/host:${DOCKER_NOTEBOOK_DIR}"

这在 jupyterhub_config.py 中用作生成器的 notebook_dir:

notebook_dir = os.environ.get('DOCKER_NOTEBOOK_DIR') or '/home/jovyan/work'
c.DockerSpawner.notebook_dir = notebook_dir
# c.DockerSpawner.volumes = {
#     'jupyterhub-user-{username}': notebook_dir,
#     'jupyter-shared': '/home/jovyan/work/shared/',
#     'jupyter-geoserver': '/home/jovyan/work/geoserver',
#     'jupyter-modules': '/home/jovyan/work/modules'
#}
c.DockerSpawner.volumes = { 'jupyter-serverdata': notebook_dir,
    'jupyter-shared': '/home/jovyan/work/shared/',
}

我认为 ipython 笔记本应该访问 /path/on/host 的内容,但我仍然得到与标准配置相同的目录(具有相同的内容,即使我删除了jupyterhub 容器和图像)。 我怀疑这是由于 DockerSpawner 造成的,我尝试使用 SimpleLocalProcessSpawner,但仍在其 docker 容器中 运行ning jupyterhub。但是我无法将其设置为 运行(产生错误 500)。

任何有关如何通过 docker 容器中的 jupyterhub 运行 将外部路径(主机路径)提供给 jupyter notebook 实例的帮助将不胜感激。

查看文档和代码通常会有所帮助。我开始工作了:

在dockerspawner源代码中 https://github.com/jupyterhub/dockerspawner/blob/master/dockerspawner/dockerspawner.py#L218 将主机 file/directory 安装到容器中的选项(但是描述不够详细,我无法理解如何安装。为此,测试很有帮助: https://github.com/jupyterhub/dockerspawner/blob/3906f4bebc92b383c73fb8d06c58a7c57003939a/tests/volumes_test.py#L25 建议指定

notebook_mount_dir = '/path/on/host'
notebook_dir = '/path/in/dockerinstance'
c.DockerSpawner.volumes = {notebook_mount_dir: {"bind": notebook_dir, "mode": "rw"}}

应该让它起作用,而且确实如此。 希望这对以后的任何人都有帮助。