带有SystemUserSpawner的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

我试图在虚拟机上运行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 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'}