Loading

用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真得进棺材,老古董就该待在棺材里)

posted @ 2025-06-15 15:04  ViKyanite  阅读(65)  评论(2)    收藏  举报