Jupyter如何在Docker容器中启动内核?

8
我想要轻松地在不同内核之间切换笔记本电脑。其中一个用例是快速测试tensorflow 2、2.2、2.3的代码,还有许多类似的用例。但是我现在更喜欢将我的环境定义为dockers,而不是不同的(conda)环境。
我知道你可以在容器中启动jupyter,但那不是我想要的。我希望只需点击Kernel > use kernel > TF 2.2 (docker),就可以让jupyter连接到在此容器中运行的内核。
有这样的东西吗?我已经使用livy通过ssh连接到远程spark内核,所以感觉应该是可能的。
1个回答

16

全面披露:我是 Dockernel 的作者。

使用Dockernel

将以下内容放入名为 Dockerfile 的文件中,存放在单独的目录中。

FROM python:3.7-slim-buster

RUN pip install --upgrade pip ipython ipykernel
CMD python -m ipykernel_launcher -f $DOCKERNEL_CONNECTION_FILE

然后执行以下命令:

docker build --tag my-docker-image /path/to/the/dockerfile/dir
pip install dockernel
dockernel install my-docker-image

现在在Jupyter中创建新笔记本时,您应该看到“my-docker-image”选项。

手动方式

可以在没有太多额外实现/工具的情况下完成这种事情,只需要一些手动操作:

  1. 使用以下Dockerfile
FROM python:3.7-slim-buster

RUN pip install --upgrade pip ipython ipykernel
  1. 使用docker build --tag my-docker-image .命令构建镜像。

  2. 创建一个内核规范目录,例如~/.local/share/jupyter/kernels/docker_test(Windows上为%APPDATA%\jupyter\kernels\docker_test)。

  3. 将以下内核规范放入您创建的目录中的kernel.json文件中(Windows用户可能需要稍微更改argv)。

{
 "argv": [
  "/usr/bin/docker",
  "run",
  "--network=host",
  "-v",
  "{connection_file}:/connection-spec",
  "my-docker-image",
  "python",
  "-m",
  "ipykernel_launcher",
  "-f",
  "/connection-spec"
 ],
 "display_name": "docker-test",
 "language": "python"
}

Jupyter现在应该能够使用上述指定的docker镜像启动一个容器。


1
@Roelant,这是因为该文件被容器编辑了,即容器内核写入了该文件。由于它通过运行在管理员权限下的Docker守护程序绑定到容器文件系统,因此该文件获得了只有管理员才能编辑的访问权限。这非常依赖于设置。这是在内核第一次启动时发生还是在重试后发生的? - Błażej Michalik
当我第一次启动内核时会出现这种情况。如果我使用 ENV JUPYTER_RUNTIME_DIR=/tmp/runtime 并调整 -f 标志的位置,可能会得到不同的错误信息 Timeout waiting for kernel_info reply。但是,如果我还要调整 {connection_file}:/tmp/runtime/connection_spec,那么我又会遇到权限错误。无论我是否以管理员身份运行 jupyter,都会出现这种情况。 - Roelant
1
你有没有关于如何使用 singularity 实现类似功能的想法或指针?HPC 管理员不喜欢在集群上运行 docker,因为它需要提升权限。如果有帮助的话,singularity 可以本地运行 docker 镜像。 - axolotl
@axolotl 我不知道,我没有使用过它。 - Błażej Michalik
1
@axolotl 我意识到我的评论有点晚了,但它可能对某人有用。我刚刚在一个运行着Singularity容器的内核上使其工作。基本上,你可以通过将Michalik上面回答中的'argv'条目替换为类似于["singularity", "exec", "path_to_sif", "python", "-m", "ipykernel_launcher", "-f", "{connection_file}"]的内容来实现。祝好运 - undefined
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接