使用DockerSpawner启动jupyterhub时​​,“ Authenticator.pre_spawn_start中的错误:获取服务器API版本时出现DockerException错误”

问题描述

我开始使用jupyterhub,现在我正在与错误做斗争,希望您能有所帮助。 我有一个有效的jupyterhub配置:

import environ 
import simplespawner
import tmpauthenticator

ROOT_DIR = environ.Path(__file__) - 2
env = environ.Env()
env.read_env(str(ROOT_DIR.path(".env")))

c.JupyterHub.port = 8008
c.JupyterHub.authenticator_class = tmpauthenticator.TmpAuthenticator
c.JupyterHub.spawner_class = simplespawner.SimpleLocalProcessspawner
c.Spawner.notebook_dir = NOTEBOOK_DIR

没关系,但是现在我想将SimpleLocalProcessspawner更改为DockerSpawner。我跑了

docker pull jupyterhub/singleuser

并将以上配置更改为:

....
c.JupyterHub.spawner_class = dockerspawner.DockerSpawner
c.DockerSpawner.image = 'jupyterhub/singleuser:latest'
docker0 = netifaces.ifaddresses('docker0')
docker0_ipv4 = docker0[netifaces.AF_INET][0]
c.JupyterHub.hub_ip = docker0_ipv4['addr']

现在我最终会遇到错误

500:Authenticator.pre_spawn_start中的内部服务器错误错误提取服务器API版本时发生DockerException错误:(“连接 中止。”,PermissionError(13,“权限被拒绝”)),您可以尝试 从主页重新启动服务器。

你能告诉我我在做什么错吗?

编辑: 写作:

sudo chmod 666 /var/run/docker.sock

允许我在此配置下运行jupyterhub。问题是每次重新启动计算机后都必须运行它。如何使其永久化?

解决方法

此错误可能有多种可能的原因:

  1. 确保运行 JupyterHub 的用户是 docker 组的成员(使用 id 检查)。这很可能是因为将 /var/run/docker.sock 的权限设置为 666 可以解决问题。

  2. 容器必须挂载 Docker 套接字 /var/run/docker.sock。如果您有一个 docker-compose.yml 文件,那么它应该包含相应的 volumes 设置,如下所示:

     volumes:
         # Give access to Docker socket
         - /var/run/docker.sock:/var/run/docker.sock
    
  3. 其他东西...考虑到 Docker 和 JupyterHub 的复杂性。 :-)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...