当前位置: 首页 > 后端技术 > Python

还在使用Alpine作为Docker的Python开发基础镜像吗?其实Ubuntu更好

时间:2023-03-26 19:24:00 Python

原文转载自《刘越的科技博客》https://v3u.cn/a_id_173一般情况下,当你要为你的Python开发环境选择一个基础镜像时,大多数人会选择阿尔派,为什么?因为它太小了,只有大约5MB(相比Ubuntu系列镜像接近100MB),但事实是我们没有选择基础镜像来体验Python语法。在此基础上,我们需要调试安装各种扩展,可能会安装很多第三方依赖,甚至预置更多的服务。在这种环境下,Alpine并不是一个好的选择。本次我们将分别体验在Alpine和Ubuntu上安装安装。编译Python的区别。先分别拉取Alpine和Ubuntu的镜像:dockerpullubuntu:18.04dockerpullalpine拉取后可以看到大小确实有明显差距:REPOSITORYTAGIMAGEIDCREATEDSIZEubuntu18.046526a1858e5d2weeksago64.2MBalpinelatesta24bb40132963个月前5.57MBUbuntu占用64mb,而alpine只占用5.57mb。不过不用担心,假设我们的Python应用程序需要进行一些科学计算并以图形方式显示数据。这时候我们就需要matplotlib和pandas这两个库的帮助了。首先,用ubuntu安装这两个库,编写Dockerfile.ubuntuFROMpython:3.7-slimRUNpipinstall--no-cache-dirmatplotlibpandas然后运行镜像脚本:dockerbuild-fDockerfile.ubuntu-t'ubuntu-mat'。可以看到,编译后的镜像从原来的60mb猛增到263mb。liuyue:blogliuyue$dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEubuntu-matlatest401f0425ce63大约一分钟前263MB使用没问题。现在,让我们试试Alpine,看看它在速度和大小方面是否比Ubuntu有优势写入Dockerfile.alpine:FROMpython:3.7-alpineRUNpipinstall--no-cache-dirmatplotlibpandas编译镜像脚本dockerbuild-fDockerfile.alpine-t'高山垫'。在编译过程中,我们会发现报错:liuyue:blogliuyue$dockerbuild-fDockerfile.alpine-t'alpine-mat'。将构建上下文发送到Docker守护程序112.1kB步骤1/2:从python:3.7-alpine3.7-alpine:从库/python中提取df20fa9351a1:提取完整36b3adc4ff6f:提取完整4db9de03f499:提取完整cd38a04a61f4:提取完整6bbb0c43b470:提取完整摘要:sha256:d1375bf0b889822c603622dc137b24fb7064e6c1863de8cc4262b61901ce4390Status:Downloadednewerimageforpython:3.7-alpine--->078114edb6beStep2/2:RUNpipinstall--no-cache-dirmatplotlibpandas--->Runningin6d3c44420e5cCollectingmatplotlibDownloadingmatplotlib-3.3.1.tar.gz(38.8MB)错误:命令出错,退出状态为1:命令:/usr/local/bin/python-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'/tmp/pip-install-40p0g06u/matplotlib/setup.py'"'"';__file__='"'"'/tmp/pip-install-40p0g06u/matplotlib/setup.py'"'"';f=getattr(tokenize,'"'"'open'"'"',open)(__file__);code=f.read().replace('"'"'\r\n'"'"','"'"'\n'"'"');f.close();exec(compile(code,__file__,'"'"'exec'"'"'))'egg_info--egg-base/tmp/pip-pip-egg-info-zk64hzamcwd:/tmp/pip-install-40p0g06u/matplotlib/这是如何工作的?仔细观察上面的基于Ubuntu的构建,你会发现它下载三方库的安装包是matplotlib-3.1.2-cp38-cp38-manylinux1_x86_64.whl,这是一个预编译好的二进制安装包,Alpine只能下载源码的压缩包(matplotlib-3.1.2.tar.gz),这是Alpine的致命问题:标准的Linux安装包根本无法在AlpineLinux上使用。大多数Linux发行版使用标准C库(glibc)的GNU版本,几乎所有基于C的脚本语言(包括Python)都需要它。但是AlpineLinux使用musl,而那些二进制安装包是针对glibc编译的,所以Alpine禁用了Linux安装包支持。大多数Python包现在都包含PyPI上的二进制安装程序,大大加快了安装时间。但是,如果您使用的是AlpineLinux,则需要编译您使用的每个Python包中的所有C源代码。这也意味着你需要自己搞清楚各个系统库的依赖关系。提前编译好需要的依赖,重写Dockerfile.alpine:FROMpython:3.7-alpineRUNapk--updateaddgccbuild-basefreetype-devlibpng-devopenblas-devRUNpipinstall--no-cache-dirmatplotlibpandas再次编译:dockerbuild-fDockerfile.alpine-t'alpine-mat'。经过漫长的编译安装,大约半小时左右,因为我们都知道从源码编译安装比通过安装包安装慢很多,这里查看编译后的镜像:REPOSITORYTAGIMAGEIDCREATEDSIZEalpine-matlatest601f0425ce63大约一分钟前873MB,可以看到体积变成了873mb,Alpine最引以为豪的小巧轻便的特性消失了。.虽然从理论上讲,Alpine使用的musl内核与其他Linux发行版使用的glibc大部分兼容,但在实践中,这种差异可能会导致各种问题。当这些问题真的出现时,解决起来就没那么简单了。比如Alpine线程默认的栈容量很小,会导致Python崩溃,也会影响Python应用的运行速度。结论:在本地环境下,如果只是想“玩玩”,选择Alpine作为基础镜像无可厚非,但如果要将你的python应用部署到生产环境,尤其是部署分布式系统时,需要多个编译在这种情况下,选择旧的Ubuntu显然更明智。原文转载自《刘越的技术博客》https://v3u.cn/a_id_173