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的执行文件路径,如下:

image-20200416173405489

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群:

 

微信公众号:

 
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐