将Spyder连接到运行在Docker容器中的远程Jupyter Notebook

8

我一直在尝试将Spyder连接到在远程服务器上运行的docker容器,但一次又一次地失败。这是我试图实现的简要示意图:

"我的沮丧情况"

目前,我通过ssh在远程机器上启动docker容器:

docker run --runtime=nvidia -it --rm --shm-size=2g -v /home/timo/storage:/storage -v /etc/passwd:/etc/passwd -v /etc/group:/etc/group --ulimit memlock=-1 -p 8888:8888 --ipc=host ufoym/deepo:all-jupyter

所以我正在转发端口8888。然后在Docker容器内运行。
jupyter notebook --no-browser --ip=0.0.0.0 --port=8888 --allow-root --notebook-dir='/storage' 

好的,现在是关于Spyder的部分 - 根据这里的说明,我进入~/.local/share/jupyter/runtime文件夹,在那里我找到以下文件:

kernel-ada17ae4-e8c3-4e17-9f8f-1c029c56b4f0.json  nbserver-11-open.html  nbserver-21-open.html  notebook_cookie_secret
kernel-e81bc397-05b5-4710-89b6-2aa2adab5f9c.json  nbserver-11.json       nbserver-21.json

由于不知道该选择哪个文件,我将它们全部复制到了本地机器上。

现在,我转到“控制台->连接到现有内核”,这会给我一个“连接到现有内核”的窗口,我按以下方式填写(当然要使用我的实际远程IP地址):

"Connect to an Existing Kernel"

(这里我选择了Connection info:的第一个json文件)。我按回车键,Spyder变暗并崩溃了。

"Spyder goes dark and crashes"

无论我选择哪个连接信息文件,都会发生这种情况。所以,我的问题是:

1:我是否做得正确?我发现有很多关于如何连接到远程服务器的说明,但迄今为止还没有特别针对连接到远程服务器上的docker上的jupyter笔记本电脑。

2:如果是的话,还能做什么来解决我遇到的问题?

我还应该注意到,我在本地机器上通过浏览器连接到Jupyter Notebook没有任何问题。只是我更喜欢将Spyder作为我的IDE。

非常感谢提前!


2
恭喜您中奖:) - Stefan
嗯...我有点脑子一片空白。虽然你可能需要双重检查,看看是否只需要使用端口8888。 - Stefan
1
我在这里也有同样的问题:https://stackoverflow.com/questions/53891567/connect-spyder-to-a-console-in-a-docker-container-on-a-remote-host?noredirect=1#comment100792570_53891567,但我没有像你这样清楚地描述我的困境! :) - shaunakde
1
@shaunakde 看起来 PyCharm 有一个解决方法(但对于 Spyder 不起作用),如此描述:https://youtrack.jetbrains.com/issue/PY-33489。我尝试过了,它确实有效,但不适合我,因为它需要在服务器上使用 sudo 访问权限(我没有),而且根本不安全,所以即使我有权限我也不会使用它。 - Mr Squid
不是我的答案,但你尝试过这个吗?https://medium.com/@halmubarak/connecting-spyder-ide-to-a-remote-ipython-kernel-25a322f2b2be旧版本的Spyder没有预先安装spyder-kernel。 - EyesBear
显示剩余7条评论
3个回答

3

这并不是一个解决方法,而是一种变通方法,但是sshfs可能会有所帮助。

使用sshfs将远程机器的家目录挂载到本地目录上,然后您本地的Spyder可以像编辑本地文件一样编辑该文件。

sshfs remotehost.com:/home/user/ ./remote-host/

在Spyder中保存更改后,将更改上传到AWS主机通常需要大约半秒钟的时间,这对我来说是可以接受的延迟。当运行代码时,通过ssh登录到远程机器,并从IPython shell中运行代码。这并不优雅,但它确实有效。

我不指望这是最好的答案,但也许您可以将其用作权宜之计。


2

我和你遇到了相同的问题。我设法解决了,虽然我对docker完全是新手,可能有点笨拙。以下是我的步骤和注释,希望能帮到你:

  • 在远程机器上启动docker容器:

    docker run --gpus all --rm -ti --net=host -v /my_storage/data:/home/data -v /my_storage/JSON:/root/.local/share/jupyter/runtime repo/tensorflow:20.03-tf2-py3

我使用第二个卷挂载,以便将kernel.json文件传输到我的本地计算机。我无法通过ssh直接从docker访问它,因为它位于docker容器中的/root/文件夹中,并且需要root权限才能访问。如果您知道如何直接从那里读取,我会很高兴学习。我的解决方法是:在远程机器上创建一个JSON/目录,并将其映射到容器中的“jupyter --runtime-dir”。一旦创建了内核,就可以通过这个卷挂载访问kernel-xxx.json文件,将其复制到本地计算机并进行chmod。

  • 在容器中启动ipython内核: ipython kernel 您正在启动jupyter notebook。我怀疑这是您的问题所在。我不确定spyder是否适用于notebooks,但它适用于iPython内核。也许,在spyder-kernels上效果更好。

  • 将kernel.json文件从/remote_machine/JSON复制到本地计算机,并进行chmod以便访问。

  • 启动spyder,使用本地的kernel.json和ssh设置。这部分与您的相同。

0

声望不够...无法添加评论,但可以对@asim的解决方案进行评论。我能够让我本地安装的Spyder连接到在远程机器上运行的容器中的内核。需要一些手动操作,但我可以接受,因为我可以用Spyder完成比其他IDE更多的工作。

docker run --rm -it --net=host -v /project_directory_remote_machine:/container_project_directory image_id bash

从容器中

python -m spyder_kernels.console - matplotlib=’inline’ --ip=127.0.0.1 -f=/container_project_directory/connection_file.json

从远程机器上,使用chmod命令打开connection_file.json文件,然后将其内容复制/粘贴到本地机器上的一个文件中 :) 使用json文件按照下面的步骤连接到远程内核。

https://medium.com/@halmubarak/connecting-spyder-ide-to-a-remote-ipython-kernel-25a322f2b2be https://mazzine.medium.com/how-to-connect-your-spyder-ide-to-an-external-ipython-kernel-with-ssh-putty-tunnel-e1c679e44154


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