暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python 项目镜像打包如何更快

写程序的日子 2020-07-15
1092

今天聊聊 docker 打包 python 项目,如何提速

根据短板理论,需要分析出最耗时的部分。

此前采用的逻辑通常是以下几个:

  1. FROM image ;

  2. COPY ;

  3. UPDATE && install ;

  4. pip install packages ;

  5. rm ;

概括起来:从一个linux 镜像,更新本地软件列表,安装相关依赖,复制项目源码,根据requirements.txt安装python第三方库,最后删除过程文件。

为了打包镜像更小,通常把linux 更新、依赖安装和python 第三方库安装、删除过程文件 通过 && 结合在一起。

因为调用了网络下载,所以除了几个有限的、无关紧要的dockerfile 命令,会用到docker 的缓存,核心的镜像打包过程,都利用不到缓存。

所以主要的时间消耗主要集中表现在CPU 的耗时和网络下载的耗时,包括FROM 和COPY 命令也会被CPU 等硬件设备的影响,但感性分析,更多的集中在linux 更新下载和python第三方库下载安装。

硬件设备,并非想提升就能提升,所以此处主要是思考在不影响日常的开发流程或者便捷度的情况下,减少网络请求的发起——避免 python 第三方库下载。

  1. pip install --no-index --find-links=./libs -r requirements.txt

这条命令可以让pip 在安装时,从本地的某个目录寻找第三方库直接安装,而非从pypi 官网下载。

那么我们需要做的便是,日常开发过程中,把第三方库下载到本地的libs 目录便可。

  1. pip download -d ./libs -r requirements.txt

但是仍然是有瑕疵的,比如 windows 开发平台和linux 平台下载的第三方库不兼容,可以采用下载保存两个平台下的第三方库,或者保持开发环境和发布环境一样(开始理解以linux 作为开发环境的用处)

  1. pip download -d ./libs --platform manylinux1_x86_64 --no-deps --no-build-isolation -r requirements.txt

真的提速了么?

阿里云服务器中的做测试,由于阿里云流入带宽很高,所以无论是linux 的更新下载,还是python第三方库的下载(下载镜像指向国内服),都很快,所以同比与本地寻找直接安装,并没有起到很大的质的变化。

但可以预估,在私有云或者个人电脑上,python 第三方库下载所需时间的节省,是能够明显提升docker 打包的速度。

linux 更新和下载怎么办

抛开高速的带宽,将linux 更新下载看做一个瓶颈的话,我更愿意将更新和下载和后面的第三方库安装等操作分开(有违目标指向镜像尽可能小的原则),前者可以通过打包成镜像供后续多次使用。

这里可能就需要考虑,第一原则是镜像大小,还是打包速度?比如,前期为了快速迭代更新,可以采用分开,后期迭代速度下降,为了更好的运行,可以采用合并在一起?


文章转载自写程序的日子,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论