时间:20210810,版本:0.1,
ROBOTECH_ERX
一个放在docker里的python程序,分析一下实现原理,需要搭建调试环境单步调试。镜像是一个ubuntu 16 lts,镜像中的python环境管理使用的是virtualenv+virtualenvwrapper。本地环境是ubuntu20.04lts桌面版.
几种解决方案:
1.使用python命令行的调试器pdb(https://docs.python.org/3/library/pdb.html),在容器里调试分析。但是毕竟感觉不舒服。最好还是在图形界面里一下下的步过比较舒服。
2.把代码和环境完整的复制出来。代码好说,virtualenv环境完整复制出来貌似不好办(virtualenv就不是为了迁移设计的),网上通用的方法是pip freeze打包所有的依赖,但是有的包不是通过pip安装的。
3.远程调试。在有图形ide的环境里调试,使用远程的interpreter和debugger。本地不需要完整的代码(脚本语言的好处)。
第三显然是最好的方案了。
需要的东东:
Pycharm 专业版。社区版不支持远程。Pycharm 专业版是支持docker调试的,但是考虑到以后可能用到其他虚拟机来干同样的事情。这里用远程SSH调试,也就是把docker当成一个远程的服务器在用了。
过程:
把项目的 docker image pull下来,使用docker cp命令把docker里的项目代码复制出来作为本地的代码。
从镜像启动容器:
$docker run -it nacknack bash #nacknack 是镜像id
看一下发行版
$cat /etc/issue
是Ubuntu 16.04.6 LTS,把apt的源改成国内源,http的源,https还要安装别的包,网速太慢可能安不上:
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security multiverse
安装ssh:
$ sudo apt update
$ sudo apt install openssh-server
$ sudo service sshd start
$ ps -aux | grep ssh
$ sudo service sshd status
修改ssh的配置文件:vi /etc/ssh/sshd_config
#PermitRootLogin prohibit-password #这个注释掉,添加下面的两个:
PermitRootLogin yes
PasswordAuthentication yes #添加
然后 重启sshd 服务
$ sudo service sshd reload //停止进程后重启(推荐)
$ sudo service sshd restart //干掉进程后重启(不推荐)
然后给root账户添加密码
~$ sudo passwd root
刚才直接启动了容器,没有配置端口映射。然后就发现在配置映射有点晚了,容器启动以后没有官方的手段建立映射。Stop容器以后,也没有添加映射的方法。网上有些方法,比如iptable转发,试了没起作用。所以,先commit为镜像,然后重新启动容器。
~$ docker commit 6aca nacknack:v-ssh #v-ssh 是标签
sha256:f3e2736826592158da37051fe69e5047e8bb1dc1f7a7651a15c4513ed881f486
启动,并映射端口:
~$ docker run -it -p 3004:22 nacknack:v-ssh bash
容器里要启动ssh,不会自动启动
~$ sudo service ssh start (不是sshd。。。)
* Starting OpenBSD Secure Shell server sshd [ OK ]
测试ssh登录,注意是映射到到了宿主机,不是docker自己的ip,这里是在本机,所以是回环地址。(本机直接ssh 容器ip:22是失败的,没有深究原因)
~$ ssh root@127.0.0.1 -p 3004
下载专业版pycharm,找到下面这个文件,启动(或者做个图标):
~$ sh /mytools/pycharm/pycharm-2020.1/bin/pycharm.sh
在pycharm里打开本地的代码文件夹,工程名是XXX。
配置 project的解释器 (file->settings->Project:xxx->Project Interpreter)
选SSH调试器,添加相应的配置,包括服务器的地址、端口和密码。
选择远程机器上的调试器,容器里的项目使用了virtualenv,
$ workon tata #进入对应的virtualenv环境。
$ which python #查看环境的解释器地址
/home/tata/.virtualenvs/tata/bin/python #
配置好本地和远程代码的映射。(在我这里,有时候配置会不成功,导致调试的时候会显示 找不到文件或目录,配置完了检查一下,不成功就重新配置一下。不需要单独配置deploment和sftp,这里自动就配置了)
自动上传那个看情况选取,如果文件太多了,扫描、同步一遍就会卡死。
详细的可以参考:
https://www.jetbrains.com/help/pycharm/2021.2/configuring-remote-interpreters-via-ssh.html
然后可以开始欢快的调试了。
(注:这里仅仅是为了分析理解而调试程序,生产环境不要这么干)