Pycharm 使用 Docker 容器 Python 作为远程解释器
Pycharm use Docker Container Python as Remote Interpreter
我正在尝试使用远程机器上 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
我可以将 Jupyter notebook 运行 的端口 8888 转发到 ssh -L 8888:0.0.0.0:8888 BBB.BBB.BBB.BBB
上,从而在本地计算机上使用它。但我不太喜欢使用 Jupyter 进行开发,我想在 Pycharm.
的 Docker 容器中使用 Python 解释器
当我在 Pycharm 中 select "Add Python Interpreter" 时,我得到以下选项:
Pycharm 的 documentation 建议使用如下所示的 "Add Python Interpreter/Docker" 工具:
但是,如果 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 中步骤的子集,不需要端口 22 的东西)
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
中删除之前的密钥;只需按照警告中的说明进行操作即可。
- 从本地机器测试 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>
- select 解释器,可以使用文件夹图标导航,它将引导您浏览 docker 内的路径,或者您可以从容器 [=] 输入
which python
的结果62=]
- 遵循 pycharm 提示
我正在尝试使用远程机器上 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
我可以将 Jupyter notebook 运行 的端口 8888 转发到 ssh -L 8888:0.0.0.0:8888 BBB.BBB.BBB.BBB
上,从而在本地计算机上使用它。但我不太喜欢使用 Jupyter 进行开发,我想在 Pycharm.
当我在 Pycharm 中 select "Add Python Interpreter" 时,我得到以下选项:
Pycharm 的 documentation 建议使用如下所示的 "Add Python Interpreter/Docker" 工具:
但是,如果 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 中步骤的子集,不需要端口 22 的东西)
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
中删除之前的密钥;只需按照警告中的说明进行操作即可。
- 从远程机器(不在容器内)的正常命令提示符:
- 从本地机器测试 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 中的 - 使用
ssh <container_host_name_defined_in_ssh_config>
测试配置;还应该将您放入交互式容器
ProxyJump Example
- 配置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>
- select 解释器,可以使用文件夹图标导航,它将引导您浏览 docker 内的路径,或者您可以从容器 [=] 输入
which python
的结果62=] - 遵循 pycharm 提示