代码之家  ›  专栏  ›  技术社区  ›  9769953

带有SystemUserSpawner的JupyterHub失败

  •  0
  • 9769953  · 技术社区  · 5 年前

    我正在尝试使用 dockerspawner.SystemUserSpawner ,生成Jupyter实验室实例。

    我的jupyterhub_配置。py有以下(额外)行:

    c.Spawner.default_url = '/lab'
    c.Spawner.cmd = ['jupyter', 'labhub']
    c.JupyterHub.spawner_class = 'dockerspawner.SystemUserSpawner'
    

    (加上 bind_url hub_ip

    跑步时( jupyterhub -f /etc/jupyterhub/jupyterhub_config.py

    [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 root 测试用户 例如,无法删除这些文件。

    (关于 c.DockerSpawner.remove = True :如果我不包括这一点,JupyterHub将被卡在以前没有的容器上 --allow-root )

    文档建议初始配置应正确,并且 对于标准docker堆栈来说是不必要的(很明显,我在这里使用的是默认的, jupyterhub/singleuser:0.9 ).

    为了进行比较,请使用 dockerspawner.DockerSpawner 很好。

    我不知道我遗漏了什么,也不知道在哪里可以找到更多的调试选项。因此,欢迎提出任何建议。

    0 回复  |  直到 5 年前
        1
  •  2
  •   9769953    5 年前

    错误在于错误 c.Spawner.cmd ( c.Spawner.cmd = ['jupyter', 'labhub'] ).

    这将使用参数启动Docker容器 jupyter labhub docker run jupyter/singleuser:0.9 jupyter labhub (带有一些附加的环境变量)。

    但是,Docker会将容器名称后的第一个参数作为 CMD 指令 在Dockerfile中。也就是说,基本笔记本电脑的Dockerfile(以及jupyter/singleuser笔记本电脑)具有以下功能:

    # Configure container startup
    ENTRYPOINT ["tini", "-g", "--"]
    CMD ["start-notebook.sh"]
    

    这将使用next命令运行入口点,即。 tini -g -- start-notebook.sh docker run . 然而,因为第一个论点取代了 指令 tini -g -- jupyter 具有 labhub 作为参数传递给 jupyter start-notebook.sh 因此 start.sh 脚本,它实际上负责处理容器内的用户ID设置。也就是说,这些启动脚本阻止root实际运行jupyter命令。跳过脚本不会阻止这一点,jupyter命令以root用户身份运行,问题中指出了这些问题。

    有两种可能的解决方法;我不清楚哪一个是首选的:

    1. 包括 开始嘘 c、 产卵器。指令 设置(我直接选择了 ):

      c.Spawner.cmd = ['start.sh', 'jupyter', 'labhub']
      

      这将取代 指挥 开始嘘 朱皮特拉布布 然后将作为参数提供给 开始嘘 . 这正是我们所需要的。

    2. 设置环境变量 JUPYTER_LAB_ENABLE 这个 :

      #c.Spawner.cmd = ['start.sh', 'jupyter', 'labhub']
      c.SystemUserSpawner.environment = {'JUPYTER_ENABLE_LAB': '1'}
      

      查看环境变量 JUPYTER_ENABLE_LAB (已获立法会通过) SystemUserSpawner 到Docker容器),并在设置此变量时运行实验室(因此,无需将其设置为 '1' 开始嘘 因此,剧本 c、 产卵器。指令

    推荐文章