Run Python in mikroTik hAP ax Lite
Why make it ?
最近在折腾协会的网络(主要是柏师傅)。刚搬到新家时,因为大伙工作的区域和路由器摆放的位置有点远,所以采取了用光纤将工作区和路由器连接的方式;但这有个小问题,光纤经过的拐角有点多,导致光损偏大,在路由器看来就是接口仰卧起坐,抖动严重。
很巧,工作区也有个网线接口,于是采取eoip将两块分隔的区域连接,目前看来效果不错(虽然中间也碰到了些问题就是了,这以后再说)。然后问题来了,我们需要在ax lite上部署两个container服务,一个是负责校园网登陆的,否则无法与对端连接;另一个是ddns的服务,其实一开始是准备用Ros自带的脚本的,但Cloudflare在国内会有访问问题,而阿里云的需要计算,所以采用container。
于是在一个夜晚一个想法诞生了
柏师傅:要不试试用python调RouterOS的api来代替脚本吧,这脚本难写的一批!
我:真的假的,真有活吗?
柏师傅:有活有活!go都有api库,python肯定有!
然后我就被忽悠上船了.jpg
大致思路
我们要做的无非就是两件事
- 起个python容器
- 跑python脚本
首先,先找个封装好的api库,我这边用的是librouteros https://github.com/luqasz/librouteros
OK,库有了,该打包python容器了。。。
真有这么简单吗?
容器打包
惊喜?!
然后我就惊喜的发现,alpine打包的带python的容器要50MB.。。。
这ax lite的ROM也就128MB,这怕不是根本跑不起来。。。
还是翻翻github吧,应该也有人闲着蛋疼缩过
然后我就找到了这个神奇的项目

man!What can I say?
但这个项目有个小问题就是这个scratch镜像啊啥也没有,有些库会直接报错

换成alpine的话会加体积,在x86下会从23MB来到30MB左右

但万幸的是,在arm下体积会回到22.8MB左右,还好
pip在拉💩!
OK,python容器解决了
吗?
当我用pip安包时发现即使我卸载了pip,镜像的体积还是来到了32MB。。
🌿,之前做的都白干了,安装的pip在到处拉💩
之前也考虑过手动复制库到python目录下的site-packages
中,但这样不太优雅,说到底最好还是pip,或者更好的方法。
是时候问问米奇喵喵屋了。
诶🤓!还真有。
用dive看看在哪拉的一拖然后手动扬掉。

好嘛,扬了!
1 | RUN rm -rf /usr/lib/python${PYTHON_VERSION}/site-packages/pip* \ |
其中ensurepip是自带的,但我们应该用不到pip了,或许后续会用到,但先扬了先。
然后我们就得到了一个非常小的镜像

好耶!