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

标签 docker ssh pycharm portforwarding

我试图在远程机器上的 docker 容器中使用 python 作为 Pycharm 中的解释器。既然是一口,这里是一张图:

enter image description here

容器中运行着一个 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 笔记本的端口 8888从而在本地机器上使用它。但是我不太喜欢使用 Jupyter 进行开发,并且想在 Pycharm 的 Docker Container 中使用 Python 解释器。

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

enter image description here

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

enter image description here

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

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

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

非常感谢!

最佳答案

感谢您在漫画中如此尖锐而清晰地描述了困境:-)。我和我的同事正在尝试做一些类似的事情,最终效果很好的是直接从远程机器跳转到 Docker 容器创建 SSH 配置,然后将其设置为远程 SSH 解释器,这样 pycharm 甚至没有意识到这是一个Docker 容器。它也适用于 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 start
  • service 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 中删除之前的 key 。 ;只需按照警告中的说明进行操作即可。

  • 从本地机器测试 SSH
  • 如果您还没有设置它,请使用 docker 容器为远程机器设置基于 ssh key 的无密码身份验证
  • 使用远程机器作为容器跳转服务器的 SSH 命令:ssh -J <remote_machine> <container_ip> ,如 https://wiki.gentoo.org/wiki/SSH_jump_host; 中所述如果成功,您应该像从远程机器一样放入容器
  • 将此设置保存在您的 ~/.ssh/config 中;关注 ProxyJump Example来自 https://wiki.gentoo.org/wiki/SSH_jump_host
  • 使用 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提示

  • 关于docker - Pycharm 使用 Docker Container Python 作为远程解释器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57157522/

    相关文章:

    daemon - 为正在运行的守护进程启用 PAM 配置 (limits.conf)

    docker - 如何在读取模式下在几个Docker容器之间正确共享文件夹?

    javascript - Docker,脚本似乎可以正确构建并运行,但无法在本地主机上连接

    java - Jsch 已知主机不工作

    python - Pycharm 不会自动创建文档 stub

    python - imp 模块已弃用

    docker - 使用 OpenShift 对 Red Hat 有任何依赖性吗

    linux - 如何在 SSH 下的 Powershell 中启动一些文件管理器?

    windows - Jenkins 问题与 Git [Permission denied (publickey).] on Windows

    python - PyCharm 中类 'objects' 的未解析属性引用 'Foo'