Docker容器

使用pycharm远程调试docker里的python程序

本文主要是介绍使用pycharm远程调试docker里的python程序,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 

 

使用pycharm远程调试docker里的python程序

时间: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当成一个远程的服务器在用了。

 

过程:

1.拉取镜像

把项目的 docker image pull下来,使用docker cp命令把docker里的项目代码复制出来作为本地的代码。

2.docker里配置ssh

从镜像启动容器:

$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

3.映射容器端口

刚才直接启动了容器,没有配置端口映射。然后就发现在配置映射有点晚了,容器启动以后没有官方的手段建立映射。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

 

4.配置pycharm远程调试

下载专业版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

 

然后可以开始欢快的调试了。

 

(注:这里仅仅是为了分析理解而调试程序,生产环境不要这么干)

参考:

 

这篇关于使用pycharm远程调试docker里的python程序的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!