PyCharm采用SSH连接Docker镜像搭建Python开发
1. 需求
在Python开发中经常会碰到一些棘手的环境问题,例如:如果开发环境是windows,那么在开发ansible模块的时候,而ansible模块又一般都是安装在linux系统,这时候在windows开发就不好处理了。
此时,可以考虑连接Docker镜像,而Docker镜像可以采用Centos作为Base Image,这样就可以顺利安装上ansible,然后使用Pycharm连接该Docker镜像来作为开发环境即可。
而不管是windows还是linux,都是可以支持安装Docker的。
2. 准备工具
- PyCharm专业版
- Docker
我的工作PC系统是WIN10,准备的Docker是安装在vmware虚拟机的Centos7环境。
3. 实现原理
Pycharm的工具是具有通过SSH协议远程访问一个环境作为开发环境的功能的。那么只要创建一个支持SSH远程访问的容器,那么就可以提供作为开发环境了。
需要做的基本步骤:
- 构建一个支持SSH服务的镜像 centos:7-ssh
- 构建基于支持SSH服务,支持执行python3环境的镜像 python_env
- 配置Pycharm的调试环境使用SSH连接上python_env
- 配置Pycharm自动同步项目的代码文件至python_env容器中,用于调试代码
4.构建一个支持SSH服务的镜像 centos:7-ssh
这个步骤就不在这里编写了,可以查阅我的另一篇文章Docker使用Centos镜像构建使用Openssh
该具有SSH功能的基础镜像命名为: centos:7-ssh
测试ssh访问如下:
# 启动容器,并且执行 /run.sh 脚本,启动ssh服务
[root@dev docker_ssh_centos]# docker run -d --name centos7_ssh -p 2222:22 centos:7-ssh /run.sh
5cc134321f63ac365835bac764865a82f6f405d2b7387572edffc8c8c090c867
[root@dev docker_ssh_centos]#
# 查看启动的容器
[root@dev docker_ssh_centos]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5cc134321f63 centos:7-ssh "/run.sh" 3 seconds ago Up 2 seconds 0.0.0.0:2222->22/tcp centos7_ssh
[root@dev docker_ssh_centos]#
# 测试使用ssh访问容器
[root@dev docker_ssh_centos]# ssh root@127.0.0.1 -p 2222
The authenticity of host '[127.0.0.1]:2222 ([127.0.0.1]:2222)' can't be established.
RSA key fingerprint is SHA256:Tx4eA0ymIH+W6uOiqdcdNAaEvpwgKlKqbd3uzlHGm+0.
RSA key fingerprint is MD5:77:6b:f8:cd:6d:ed:86:eb:a0:10:85:dd:02:00:0c:a1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[127.0.0.1]:2222' (RSA) to the list of known hosts.
root@127.0.0.1's password:
[root@5cc134321f63 ~]#
[root@5cc134321f63 ~]#
[root@5cc134321f63 ~]# ls
anaconda-ks.cfg
[root@5cc134321f63 ~]#
5.构建基于支持SSH服务,支持执行python3环境的镜像 python_env
有了支持SSH服务的基础镜像centos:7-ssh
之后,那么可以在这个镜像的基础上,构建python3的执行环境,提供用于远程环境调试。
5.1 编写Dockerfile
# Using Centos for base image
FROM centos:7-ssh
# author label
LABEL maintainer="Aron.li"
# install timezone gcc
ENV ENVIRONMENT DOCKER_PROD
RUN cd / && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& yum makecache \
&& yum install -y wget aclocal automake autoconf make gcc gcc-c++ python-devel mysql-devel bzip2 libffi-devel epel-release \
# install python 3.7.1
&& wget https://npm.taobao.org/mirrors/python/3.7.1/Python-3.7.1.tar.xz \
&& tar -xvf Python-3.7.1.tar.xz -C /usr/local/ \
&& rm -rf Python-3.7.1.tar.xz \
&& cd /usr/local/Python-3.7.1 \
&& ./configure && make && make install \
# install pip3
&& yum install -y python-pip \
&& yum install -y python-setuptools \
&& pip3 install --upgrade pip -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com \
&& pip3 install setuptools==33.1.1 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com \
&& yum clean all
# copy project
COPY . /project
5.2 执行构建
docker build -t python_env .
5.3 运行python_env ,启动容器的ssh服务
name='python_env'
image='python_env'
docker stop $name
docker rm $name
docker run -d --name $name -p 2222:22 $image /run.sh
5.4 进入容器,可以查看稍后同步的代码文件,以及在容器内执行代码
docker exec -it python_env bash
6. 配置Pycharm的调试环境使用SSH连接上python_env
6.1 选择菜单栏的File > Setting > Project Interpreter > Add , 添加调试环境

6.2 配置添加SSH调试环境


6.3 配置添加SSH调试环境中使用的python3路径
首先在容器中查看一下python3的执行文件路径:
# 查看python3的执行文件路径
[root@1e873ed42ef7 /]# whereis python3
python3: /usr/local/bin/python3 /usr/local/bin/python3.7 /usr/local/bin/python3.7-config /usr/local/bin/python3.7m /usr/local/bin/python3.7m-config /usr/local/lib/python3.7
[root@1e873ed42ef7 /]#
# 测试执行python3执行文件
[root@1e873ed42ef7 /]# /usr/local/bin/python3
Python 3.7.1 (default, Apr 16 2020, 15:19:20)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
在SSH调试环境中设置python3的执行文件路径,如下:

6.4 配置添加SSH调试环境中同步项目文件的路径,也就是拷贝文件的目标地址


6.5 配置完毕SSH调试环境的信息

6.6 配置完毕,自动上传项目目录下的文件至服务器

你会发现设置的本地文件全部都会上传到容器中,如下:

但是对于venv这个虚拟环境的文件,应该是要排除上传的,下面来配置一下。
6.7 配置排除SSH上传一些特定的文件





选中OK之后,这些路径就不会自动同步到服务器上了。
6.8 执行python脚本,查看调试信息

创建一个python脚本,点击执行,那么pycharm则会发出一条ssh的命令,将远程执行的信息同步回来展示。
7. Pycharm远程执行的相关问题
7.1 脚本自动上传不及时

我已经将脚本的打印信息修改,但是由于脚本没有上传至容器中,导致还是打印之前的信息。
这时候还是手动上传比较靠谱,如下:

这样就可以保证肯定上传成功了。但是这样还是让人体验很不爽。
7.2 检查SSH传输的配置


这里提示没有配置默认的服务器组。
问题的原因:我只配置了一个SSH镜像作为开发调试环境,但是却在配置发现有三个连接配置,顺手删除了2个,难道就是因为这个问题。
为了排查这个问题,我觉得全部删除一遍,重新配置一下。

重新配置一遍调试环境,步骤与文档的上方一致。

重新配置一遍就可以解决问题了,真的是我手贱删除了SSH传输的连接。

交流QQ群:

微信公众号:
