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

时间:2018-07-13 17:43:31

标签: python docker-compose jupyterhub

我正在为我们组中的用户设置一个jupyterhub,使其能够使用python包对常见数据运行脚本,而不必在其计算机上安装环境。 该系统基于jupyterhub-deploy-docker(https://github.com/jupyterhub/jupyterhub-deploy-docker/),并进行了修改,使其可以在本地主机(https://github.com/PHI-Toolkit/jupyterhub-deploy-docker-localhost)上运行,该本地主机从docker化的jupyterhub中生成带有单用户jupyter笔记本实例的Docker容器。这个想法是将本地主机目录(或数据服务器的主机目录)安装到jupyterhub容器中,并从那里馈送给单个用户实例,以用作notebook_dir。然后,ipynbs可以访问服务器上的数据并将其保存在其中。

整个方法在未进行dockerized时效果很好(用于测试,使用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容器中运行jupyterhub。但是我无法运行它(产生错误500的结果)。

任何对如何通过运行在docker容器中的jupyterhub的外部路径(主机路径)馈入jupyter笔记本实例的帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

查阅文档和代码通常会有所帮助。我知道它可以工作了:

在dockerspawner源代码中 https://github.com/jupyterhub/dockerspawner/blob/master/dockerspawner/dockerspawner.py#L218 将主机文件/目录挂载到容器中的选项(但是描述不够详细,我无法理解如何进行。为此,测试非常有用: 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"}}

应该使其工作并且确实可以。 希望这对以后的任何人有帮助。