使用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
然后可以開始歡快的調試了。
(注:這里僅僅是為了分析理解而調試程序,生產環境不要這么干)
參考: