带有SystemUserSpawner的JupyterHub失败
我试图在虚拟机上运行JupyterHub,使用带有SystemUserSpawner的JupyterHub失败,jupyterhub,Jupyterhub,我试图在虚拟机上运行JupyterHub,使用dockerspawner.SystemUserSpawner,生成Jupyter实验室实例 我的jupyterhub_config.py有以下(额外)行: (加上bind_url和hub_ip的行)。其他所有内容都应为默认设置 运行(jupyterhub-f/etc/jupyterhub/jupyterhub_config.py)并登录浏览器后,我遇到了一个500错误。命令行上的日志如下所示: [D 2019-02-26 16:55:37.869
dockerspawner.SystemUserSpawner
,生成Jupyter实验室实例
我的jupyterhub_config.py有以下(额外)行:
(加上bind_url
和hub_ip
的行)。其他所有内容都应为默认设置
运行(jupyterhub-f/etc/jupyterhub/jupyterhub_config.py
)并登录浏览器后,我遇到了一个500错误。命令行上的日志如下所示:
[D 2019-02-26 16:55:37.869 JupyterHub dockerspawner:644] Getting container 'jupyter-testuser'
[D 2019-02-26 16:55:37.873 JupyterHub dockerspawner:629] Container 8bf627d status: {'Dead': False,
'Error': '',
'ExitCode': 1,
'FinishedAt': '2019-02-26T15:55:29.518823812Z',
'OOMKilled': False,
'Paused': False,
'Pid': 0,
'Restarting': False,
'Running': False,
'StartedAt': '2019-02-26T15:55:28.446881243Z',
'Status': 'exited'}
[W 2019-02-26 16:55:37.874 JupyterHub web:1667] 500 GET /hub/user/testuser/ (www.xxx.yyy.zzz): Spawner failed to start [status=ExitCode=1, Error='', FinishedAt=2019-02-26T15:55:29.518823812Z]. The logs for testuser may contain details.
[D 2019-02-26 16:55:37.875 JupyterHub base:880] No template for 500
然后,JupyterHub本身陷入了一个(无止境的?)循环,试图每10秒生成一个容器
忽略丢失的500模板,从容器状态消息中我稍微聪明了一点,但是docker logs jupyter testuser
显示:
....
[C 2019-02-26 15:55:29.360 SingleUserLabApp notebookapp:1707] Running as root is not recommended. Use --allow-root to bypass.
[D 2019-02-26 15:55:29.360 SingleUserLabApp application:647] Exiting application: jupyter-notebook
当我更改jupyterhub_config.py以包括
c.Spawner.cmd = ['jupyter', 'labhub', '--allow-root']
c.DockerSpawner.remove = True
事情确实可行,但有一个不必要的警告:我现在是容器中的root,并且我在主目录中创建的任何文件都不属于testuser
,而是属于(Docker容器)root
。例如,在虚拟机本身内部,testuser
不能删除这些文件
(请注意c.DockerSpawner.remove=True
:如果我不包括该值,JupyterHub将卡在上一个容器上,该容器没有--允许root
)
文档建议初始配置应该是正确的,并且标准docker堆栈不需要--allow root
(显然我在这里使用的是默认的,jupyterhub/singleuser:0.9
)
作为比较,使用dockerspawner.dockerspawner
可以很好地工作
我不知道我遗漏了什么,也不知道在哪里可以找到更多的调试选项。因此,欢迎提出任何建议
Ubuntu 18.04.2上的Jupyter(Hub)版本0.9.4错误在
c.Spawner.cmd
(c.Spawner.cmd=['Jupyter','labhub']
)
这将使用参数jupyter-labhub
启动Docker容器,类似于从命令行以Docker-run-jupyter/singleuser:0.9 jupyter-labhub
的形式运行它(带有一些附加的环境变量)
但是,Docker将容器名称后的第一个参数读取为CMD
,而不是作为Dockerfile中CMD
的参数。也就是说,基本笔记本电脑的Dockerfile(以及jupyter/singleuser笔记本电脑)具有以下功能:
# Configure container startup
ENTRYPOINT ["tini", "-g", "--"]
CMD ["start-notebook.sh"]
这将使用下一个命令运行入口点,即tini-g--start notebook.sh
,后面是提供给docker run
的参数。但是,由于第一个参数替换了CMD
,因此执行的是tini-g--jupyter
,其中labhub
作为参数传递给jupyter
。后者绕过start notebook.sh
,从而绕过start.sh
脚本,后者实际上负责处理容器内的用户ID设置。也就是说,这些启动脚本阻止root实际运行jupyter命令。跳过脚本不会阻止这一点,jupyter命令以root用户身份运行,问题中指出了这些问题
有两种可能的解决方法;我不清楚哪一个是首选的:
c.Spawner.cmd
设置中包括start notebook.sh
或start.sh
(我直接选择了start.sh
):
这将用start.sh
替换start notebook.sh
命令(这通常很好;第一个是围绕第二个的小包装器),然后将jupyter labhub
作为start.sh
的参数提供。这正是我们所需要的JUPYTER\u LAB\u ENABLE
,并禁用c.Spawner.cmd
:
#c.Spawner.cmd = ['start.sh', 'jupyter', 'labhub']
c.SystemUserSpawner.environment = {'JUPYTER_ENABLE_LAB': '1'}
start.sh
查看环境变量JUPYTER\u ENABLE\u LAB
(由SystemUserSpawner
传递到Docker容器),并在设置此变量时运行LAB(因此,不必将其设置为'1'
)。在这种情况下,不需要向Docker容器或start.sh
脚本传递额外的参数,因此c.Spawner.cmd
被禁用非常彻底!谢谢
c.Spawner.cmd = ['start.sh', 'jupyter', 'labhub']
#c.Spawner.cmd = ['start.sh', 'jupyter', 'labhub']
c.SystemUserSpawner.environment = {'JUPYTER_ENABLE_LAB': '1'}