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吧,应该也有人闲着蛋疼缩过

然后我就找到了这个神奇的项目

tiny-python-docker-image

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
2
3
4
RUN rm -rf /usr/lib/python${PYTHON_VERSION}/site-packages/pip* \
/usr/lib/python${PYTHON_VERSION}/site-packages/setuptools* \
/usr/lib/python${PYTHON_VERSION}/site-packages/pkg_resources* \
/usr/lib/python${PYTHON_VERSION}/ensurepip

其中ensurepip是自带的,但我们应该用不到pip了,或许后续会用到,但先扬了先。

然后我们就得到了一个非常小的镜像

好耶!