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

Posted

技术标签:

【中文标题】Pycharm 使用 Docker Container Python 作为远程解释器【英文标题】:Pycharm use Docker Container Python as Remote Interpreter 【发布时间】:2019-12-01 02:36:10 【问题描述】:

我正在尝试在远程机器上的 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 Container 中使用 Python 解释器。

当我在 Pycharm 中选择“添加 Python 解释器”时,我得到以下选项:

Pycharm 的 documentation 建议使用如下所示的“添加 Python 解释器/Docker”工具:

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

所以我的问题是:我应该使用 Unix 还是 TCP 套接字连接到我的远程 docker?或者我应该以某种方式转发容器中的所有相关端口并使用“SSH解释器”选项?如果是这样,我该如何设置这一切?我是否首先正确设置了我的 Docker 容器?

在过去的两天里,我想我已经浏览了 每个 论坛和在线资源,但还没有接近让它发挥作用。我也试图让它在 Spyder 中工作,但也无济于事。因此,非常感谢任何建议!

非常感谢!

【问题讨论】:

也许youtrack.jetbrains.com/issue/PY-33489 中的解决方法可能会有所帮助,PyCharm 本身不支持此用例,因此需要额外点击鼠标。同时也不支持nvidiayoutrack.jetbrains.com/issue/PY-26429 @Pavel_Karateev 感谢您的回复。至少知道这不是微不足道的,而且我不只是犯了一些愚蠢的错误,这很有帮助。我试试看。 @Pavel_Karateev 在我的私人本地机器上试过这个,它可以工作。然而,这对我来说不是一个解决方案,因为它需要我最终希望使用的服务器上没有的 sudo 访问权限。另外,它似乎不太安全......无论如何,谢谢。 我刚刚开始这样做,因为我正在尝试做同样的事情。我一直在使用 VS Code 进行远程容器开发。你们有没有设法找到一个更用户友好的解决方案,不需要遥控器上的 sudo? 【参考方案1】:

感谢您在您的漫画中如此深刻而清晰地描绘了这一困境 :-)。我和我的同事正在尝试做类似的事情,最终效果很好的是直接创建一个 SSH 配置到从远程机器跳转的 Docker 容器,然后将其设置为远程 SSH 解释器,这样 pycharm 甚至都没有意识到它是一个码头集装箱。它也适用于 vscode。

    在 docker 容器中设置 ssh 服务(https://dev.to/s1ntaxe770r/how-to-setup-ssh-within-a-docker-container-i5i 中的步骤子集,不需要 port22 的东西) docker exec -it <container> bash: 为 docker 创建管理员交互提示 apt-get install openssh-server service ssh startservice ssh status确认-> * sshd is running 确定 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 cmd 有 -v /etc/passwd:/etc/passwd:ro \ 等)。它可能会要求输入密码。注意:如果您稍后对分配了相同 IP 的不同容器执行此操作,您将收到警告,并且可能需要从 known_hosts 中删除之前的密钥;只需按照警告中的说明进行操作即可。 从本地机器测试 SSH 如果您尚未设置,请使用 docker 容器为远程计算机设置基于 ssh 密钥的无密码身份验证 制作 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> 测试配置;还应该将您放入交互式容器中 配置 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 提示操作

【讨论】:

感谢您在提出问题这么长时间后抽出时间发布此问题的答案。

以上是关于Pycharm 使用 Docker Container Python 作为远程解释器的主要内容,如果未能解决你的问题,请参考以下文章

Pycharm,Docker和GUI

如何使用 pycharm 调试在 docker-compose 中运行的进程

Pycharm docker-compose解释器不加载库

ubuntu+docker+pycharm环境深度学习远程炼丹使用教程

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

在 docker 内的远程机器上使用 PyCharm 的远程调试器