用Docker在arm创建x86本地Python调试环境
同步一下在公司的文章吧QAQ
前言
最近新公司都是在用Python开发的,但是他们Python调试都不是本地调试,而是直接传Git然后通过堡垒机连接远程测试机进行部署,然后在测试机上跑IPython来Debug的
也就是,正常本地开发流程应该是:
1. 本地代码编写完成
2. 本地运行代码
3. ApiFox跑请求测表现
4. 打一些断点辅助debug
5. 修复bug,重复1-4直到测出没有Bug
但是在新公司就变成了:
1. 本地代码编写完成
2. 上传Git自己的测试分支
3. 通过堡垒机连接远程主机
4. 远程主机拉去测试分支代码并部署
5. Apifox跑远程测试机接口测表现
6. 查看日志看是否表现正常
7. 通过IPython工具,运行对应的service函数传参
8. 查看IPython表现
9. 修复bug,重复1-8直到测出没有Bug
开发流程就很长,而在产品那边又催的很紧,所以就需要加速简化这个开发流程。可以看出,如果有办法可以本地Debug调试的话,流程就会相对快很多,也是本文的核心
探索
常见的本地Debug方式有两种,一种是ssh连接到远程,实际上运行是在远程运行,但是通过ssh工具可以以跑本地程序的方式运行,同时支持打断点;还有一种就是docker直接创建一个Image,里面包括了所需的环境,直接本地程序运行在docker里面就可以
SSH连接到远程主机
实际上我在这一个方法上花了比较多的时间,究其原因其实就是因为我对SSH这个东西不熟悉...于是浪费了比较多的时间
SSH简介
SSH(Secure Shell)是一种用于安全远程登录和命令执行的协议。SSH 常用于远程管理服务器、传输文件以及执行远程命令。在 Linux 系统中,SSH 服务(
sshd)和 SSH 客户端(ssh)是非常重要的工具。它是以C/S的方式运行在计算机上的,被连接端在这个场景下是Server,需要运行sshd这个程序;请求连接端是Client,运行的是ssh
一般sshd都会以22作为开放端口以供连接,需要创建密钥以供客户端连接
尝试
其实说简单也是挺简单的,主要是我最开始觉得,远程主机可能运维那边不是很注意,开放了ssh端口啥的(然而运维还是很专业的qaq)。
于是最开始就最开始尝试ssh连接远程主机,不出意外连接不上。
然后尝试远程主机反向转发给堡垒机,然后只要我能连接堡垒机的任意一个端口就可以间接连接远程主机,不出意外,也是失败了。主要是因为我们的堡垒机是一个图形化的界面,以及只让输入有限的指令以供连接远程主机这样子,说的就是你(开源堡垒机!!),根本没法进行一些常见命令行的输入来开放一些端口让我ssh连接。
于是所有的路基本都被运维(太专业了QAQ)堵死了,只能尝试另一种方法
本地Docker创建远程环境
有朋友可能要问了,你用docker了为什么不用本地venv呢?
答案是:我的本地是Mac M1(arm)芯片,然后远程的主机是CentOS x86_64,完全装不了远程主机的环境...
于是我们就需要打一个x86_64架构的镜像,同时装一个跟远程主机完全相同的OS与Python库,然后ssh连接到本地的这个镜像打出的Container里面,进行本地调试...别问我为啥那么麻烦,因为我当时就想着是完全复制远程主机,相当于是自己本地造了一个远程主机
先pip freeze > requirements.txt获取远程的依赖,然后为了后续给新同事方便使用,我还顺手写了一个dockerfile,打了个镜像出来...
最后当然就是成功了!不过记得运行container的时候要以x86的模式运行,以及需要将container22端口映射到本地,以便进行ssh连接!
总结
本次为了效率优化实际上付出了很多上班摸鱼的时间,主要是真的受不了之前那套用IPython进行调试的方式,效率太低下了,而且主要是因为我们项目用的Python2!!!
我什么类型都不知道,没有断点真的要死了, ipython也是难用的一,为什么前人可以忍受这么效率低下的开发啊?
(顺便吐槽一句,py2真得进棺材,老古董就该待在棺材里)

浙公网安备 33010602011771号