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"}}
应该让它起作用,而且确实如此。
希望这对以后的任何人都有帮助。
我正在为我们组中的用户设置一个 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"}}
应该让它起作用,而且确实如此。 希望这对以后的任何人都有帮助。