Pycharm使用Docker容器Python作为远程解释器。

14

我正在尝试将在远程计算机上的Docker容器中的Python作为Pycharm的解释器使用。由于这很冗长,因此这里是一个图示:

输入图像描述

容器中有一个正在运行的Jupyter Notebook,我可以通过本地浏览器连接到它(尽管这仅用于测试连接)。我使用的启动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 -p 7722:22 --ipc=host latest:latest

我可以使用 ssh -L 8888:0.0.0.0:8888 BBB.BBB.BBB.BBB 命令将运行 Jupyter Notebook 的端口 8888 转发到本地机器上。但我不太喜欢使用 Jupyter 进行开发,而想要在 Pycharm 中使用 Docker 容器中的 Python 解释器。

当我在 Pycharm 中选择 "添加 Python 解释器" 时,会出现以下选项:

enter image description here

Pycharm 的 文档 建议使用 "添加 Python 解释器/Docker" 工具,它看起来像这样:

enter image description here

然而文档并没有说明如何设置 Docker 容器和连接,如果 Docker 在远程机器上。

所以我的问题是:我应该使用 Unix 或 TCP socket 来连接到远程 Docker 吗?还是应该转发容器中所有相关的端口并使用 "SSH Interpreter" 选项?如果是这样,我该如何设置?我是否正确地设置了 Docker 容器?

我认为我已经搜索了过去两天的 每一个论坛和在线资源,但都没有接近使它工作。我也尝试在 Spyder 中让它工作,但也没有成功。所以非常感谢任何建议!

非常感谢!


1
也许 https://youtrack.jetbrains.com/issue/PY-33489 中的解决方法可以帮到您,PyCharm并不原生支持这种用例,因此需要进行一些额外的鼠标点击。同时,nvidia也不受支持 https://youtrack.jetbrains.com/issue/PY-26429。 - Pavel Karateev
@Pavel_Karateev 谢谢您的回复。至少知道这不是一件简单的事情,我也没有犯什么愚蠢的错误,这对我很有帮助。我会尝试一下。 - Mr Squid
@Pavel_Karateev 我在我的本地机器上尝试了这个方法,它可以工作。但对我来说不是一个解决方案,因为它需要sudo访问权限,而我在最终想要使用的服务器上没有这个权限。此外,它似乎也不是很安全...无论如何还是谢谢你。 - Mr Squid
我刚刚开始尝试做同样的事情。我一直在使用VS Code的远程容器开发。你们有没有找到更加用户友好的解决方案,不需要在远程上使用sudo? - jayBana
奖励分数给出色的卡通 - undefined
1个回答

2
感谢您在漫画中生动清晰地描述了这个困境 :-)。我和我的同事一直在尝试做类似的事情,最终行之有效的方法是创建一个SSH配置直接跳转到远程机器上的Docker容器,然后将其设置为远程SSH解释器,这样PyCharm甚至不会意识到它是一个Docker容器。这对于VSCode也很有效。
  1. 在Docker容器中设置SSH服务(以下步骤是https://dev.to/s1ntaxe770r/how-to-setup-ssh-within-a-docker-container-i5i的子集,不需要端口22的内容)
    • docker exec -it <container> bash:为Docker创建管理员交互式提示符
    • apt-get install openssh-server
    • service ssh start
    • 使用service ssh status确认 -> * sshd is running
  2. 确定IP地址并从远程机器测试SSH连接到容器(改编自https://phoenixnap.com/kb/how-to-ssh-into-docker-container,步骤2和3)
    • 在远程机器上的常规命令提示符中(不在容器内):docker inspect -f "{{ .NetworkSettings.IPAddress }}" <container>以获取容器IP
    • 测试:ping -c 3 <container_ip>
    • SSH:ssh <container_ip>;应该将您放入容器作为用户;但是,需要正确配置容器(docker run命令具有-v /etc/passwd:/etc/passwd:ro \等)。它可能会要求输入密码。注意:如果您稍后为分配相同IP的不同容器执行此操作,则会收到警告,并且可能需要从known_hosts中删除先前的密钥;只需按照警告中的说明进行操作即可。
  3. 从本地机器测试SSH
    • 如果尚未设置,使用基于密钥的无密码SSH身份验证设置远程机器与Docker容器之间的连接
    • 创建使用远程机器作为跳转服务器连接到容器的SSH命令:ssh -J <remote_machine> <container_ip>,如https://wiki.gentoo.org/wiki/SSH_jump_host;所述;如果成功,您应该像从远程机器一样进入容器
    • 将此设置保存在您的~/.ssh/config文件中;按照https://wiki.gentoo.org/wiki/SSH_jump_host中的ProxyJump Example进行操作
    • 使用ssh <container_host_name_defined_in_ssh_config>测试配置;也应该将您放入交互式容器中
  4. 配置PyCharm(或VSCode或任何接受远程SSH解释器的IDE)
    • Preferences -> Project -> Python Interpreter -> Add -> SSH Interpreter -> New server configuration
    • 主机:<container_host_name_defined_in_ssh_config>
    • 端口:22
    • 用户名:<username_on_remote_server>
    • 选择解释器,可以使用文件夹图标导航,这将引导您浏览Docker内的路径,或者您可以输入来自容器的which python的结果
    • 按照PyCharm提示进行操作

1
感谢您在问题提出很久之后抽出时间回答。 - Mr Squid

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