原文转载自「刘悦的技术博客」https://v3u.cn/a_id_173

一般情况下,当你想为你的Python开发环境选择一个基础镜像时,大多数人都会选择Alpine,为什么?因为它太小了,仅仅只有 5 MB 左右(对比 Ubuntu 系列镜像接近 100 MB),但事实的真相是,我们选择基础镜像并不是为了体验一下Python语法而已,在此基础上,我们需要调试和安装各种扩展,可能会安装很多三方依赖,甚至预设更多服务,在这种环境下,Alpine就并非是一个很好的选择了,本次我们就来分别在Alpine和Ubuntu上来体验一下安装和编译Python的区别。

首先分别拉取Alpine和Ubuntu的镜像:

docker pull ubuntu:18.04
docker pull alpine

拉取完毕后,可以看到,体积上确实差距明显:

REPOSITORY                  TAG                   IMAGE ID            CREATED             SIZE
ubuntu                      18.04                 6526a1858e5d        2 weeks ago         64.2MB
alpine                      latest                a24bb4013296        3 months ago        5.57MB

ubuntu占用64mb,而alpine仅仅5.57mb。

但是先别着急,假设我们的python应用需要做一些科学计算,并且将数据以图形的方式展示出来,这时候就需要matplotlib和pandas这两个库的帮助了,先用ubuntu来安装这俩个库,编写Dockerfile.ubuntu

FROM python:3.7-slim
RUN pip install --no-cache-dir matplotlib pandas

然后运行镜像脚本:

docker build -f Dockerfile.ubuntu -t 'ubuntu-mat' .

可以看到,编译好的镜像从原先的60mb暴涨到了263mb。

liuyue:blog liuyue$ docker images
REPOSITORY                  TAG                   IMAGE ID            CREATED              SIZE
ubuntu-mat                  latest                401f0425ce63        About a minute ago   263MB

使用起来没有什么问题。

现在,我们来试试Alpine,看看速度和体积上有没有比Ubuntu更具优势

编写Dockerfile.alpine:

FROM python:3.7-alpine
RUN pip install --no-cache-dir matplotlib pandas

编译镜像脚本

docker build -f Dockerfile.alpine -t 'alpine-mat' .

在编译过程中,我们会发现报错了:

liuyue:blog liuyue$ docker build -f Dockerfile.alpine -t 'alpine-mat' .
Sending build context to Docker daemon  112.1kB
Step 1/2 : FROM python:3.7-alpine
3.7-alpine: Pulling from library/python
df20fa9351a1: Pull complete
36b3adc4ff6f: Pull complete
4db9de03f499: Pull complete
cd38a04a61f4: Pull complete
6bbb0c43b470: Pull complete
Digest: sha256:d1375bf0b889822c603622dc137b24fb7064e6c1863de8cc4262b61901ce4390
Status: Downloaded newer image for python:3.7-alpine  ---> 078114edb6be
Step 2/2 : RUN pip install --no-cache-dir matplotlib pandas  ---> Running in 6d3c44420e5c
Collecting matplotlib  Downloading matplotlib-3.3.1.tar.gz (38.8 MB)  ERROR: Command errored out with exit status 1:  command: /usr/local/bin/python -c 'import sys, 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('"'"'rn'"'"', '"'"'n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-pip-egg-info-zk64hzam  cwd: /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安装包在Alpine Linux上根本无法使用。

大多数Linux发行版都使用GNU版本的标准C库(glibc),几乎所有基于C语言的脚本语言都需要这个库,包括Python。但Alpine Linux使用的是musl,那些二进制安装包是针对glibc编译的,因此Alpine禁用了Linux安装包支持。现在大多数Python包都在PyPI上包含了二进制安装包,大大加快了安装时间。但是如果你使用的是Alpine Linux,你需要编译你使用的每一个Python包中的所有C源码。

这也就意味着你需要自己弄清楚每一个系统库的依赖性。事先编译好需要的依赖,重新改写Dockerfile.alpine:

FROM python:3.7-alpine
RUN apk --update add gcc build-base freetype-dev libpng-dev openblas-dev
RUN pip install --no-cache-dir matplotlib pandas

再次编译:

docker build -f Dockerfile.alpine -t 'alpine-mat' .

经过了漫长的编译安装,大约半个小时左右,因为我们都知道从源码编译安装要远远慢于通过安装包安装,此时查看编译好的镜像:

REPOSITORY                  TAG                   IMAGE ID            CREATED              SIZE
alpine-mat                  latest                601f0425ce63        About a minute ago   873MB

可以看到体积已经变成873mb了,Alpine最引以为傲的体积小轻便等特性也已经荡然无存。

虽然从理论上讲,Alpine使用的musl 内核与其他Linux发行版使用的glibc大多是兼容的,但在实际操作中,这种差异可能会造成各种问题。而当这些问题真的发生时,想解决它们就没那么简单了,比如说Alpine的线程默认堆栈容量较小,这会导致Python崩溃,同时也会影响python应用的运行速度。

结语:在本地环境,如果你只是想“玩一玩”,那么基础镜像选择Alpine无可厚非,但是如果你想要将你的python应用部署到生产环境时,特别是部署分布式系统需要多次编译的场景下,选择老牌的Ubuntu显然更加的明智。

原文转载自「刘悦的技术博客」 https://v3u.cn/a_id_173

dockerfile拉取私库镜像_还在用Alpine作为你Docker的Python开发基础镜像?其实Ubuntu更好一点...相关推荐

  1. dockerfile拉取私库镜像_从私有仓库拉取镜像

    从私有仓库拉取镜像 浏览 0 扫码 分享 2019-10-27 17:16:54 origin_last_modified:2019-06-06 06:18(#14740) 译文原文 英文原文 版权声 ...

  2. dockerfile拉取私库镜像_Dockerfile From 私有库认证问题

    一. 写作背景 近期折腾 Docker.K8S,在 K8S 集群上搭建了 Harbor 等应用,在使用过程中发现一些问题记录一下. 此次问题是向私库传输镜像后,在 dockerfile 中使用该镜像系 ...

  3. python单词软件哪个好_还在用背单词App?使用Python开发英语单词自测工具,助你逆袭单词王!...

    学英语广告 最近也许是刚开学的原因,不管是公众号,还是刷抖音,导出都能看到关于学英语.背单词的广告. 不知道现在学生们背单词买的什么辅导材料.反正我们上学那会,<星火阅读>特别的火.记得当 ...

  4. golang配置export GOPRIVATE拉取私有库代码

    golang配置export GOPRIVATE拉取私有库代码 可参考链接: http://t.zoukankan.com/jwentest-p-12520378.html

  5. python开发基础戴歆第四章_第一阶段:Python开发基础 day04 课后练习

    第一阶段:Python开发基础 day04 课后作业 1.简述python的五大数据类型的作用.定义方式.使用方法 数字类型 字符串类型 列表 字典 布尔型 答:数字类型分为整型(int)和浮点型(f ...

  6. docker 怎样用一个基础镜像然后做一个新的镜像

    docker 怎样用一个基础镜像然后做一个新的镜像 我们知道docker 镜像必须有一个基础镜像,那么如何从一个基础镜像制作出自己需要的镜像呢? docker load 基础镜像 ------load ...

  7. rabbitmq 拉取消息太慢_面试官:消息队列这些我都要问

    作者:mousycoder segmentfault.com/a/1190000021054802 消息队列连环炮 项目里怎么样使用 MQ 的? 为什么要使用消息队列? 消息队列有什么优点和缺点? k ...

  8. windows制作docker镜像_.NET Core程序跑在任何有docker的地方

    (给DotNet加星标,提升.Net技能) 转自:沛山cnblogs.com/peyshine/p/12918315.html 一.分别在Windows/Mac/Centos上安装Docker Win ...

  9. docker desktop ubuntu镜像_资深专家都知道的顶级 Docker 命令!

    开发人员一直在努力提高 Docker 的使用率和性能,命令也在不停变化.Docker 命令经常被弃用,或被替换为更新且更有效的命令,本文总结了近年来资深专家最常用的命令列表并给出部分使用方法. 目前, ...

最新文章

  1. Mac 下安装 Python-OpenCV Python-OpenCV 处理图像(一):基本操作
  2. 周报速递丨《网络安全审查办法》修订发布;微信支持数字人民币支付
  3. java ee io_JAVAEE细细看 进阶 14 - IO总结-Go语言中文社区
  4. 啥?这就是一个高级报表/BI数据分析工程师的一天?
  5. 5分钟了解VMware vSAN的分布式RAID
  6. Java开发者需要掌握的基础知识
  7. php gtk教程,PHP-GTK 介绍及其应用-PHP教程,PHP应用
  8. Linux下使用ps命令来查看Oracle相关的进程
  9. 解决导出CSV后在EXCEL打开纯数字前面0丢失问题
  10. c#基础知识——main
  11. Servlet教程第8讲笔记
  12. SQL Server 2012 中 SSAS 多维数据浏览器已经废除
  13. 切图直接导出html,Dreamweaver切图到生成网页的方法
  14. 这些免费模板,让Excel轻松制作精美图表
  15. 用于实时实例分割的Deep Snake算法
  16. 【Red5流媒体服务器搭建】
  17. Qunee For Html5 开发清新、高效的拓扑图组件
  18. 小程序项目:基于微信小程序的每日签到打卡——计算机毕业设计
  19. 用MATLAB实现高斯投影正反算且画出高斯投影图形
  20. 怎样学习有限元分析才能更快?

热门文章

  1. Memcached 使用 及.NET客户端调用
  2. 基于MATLAB的Sobel边缘检测算法实现
  3. C#多线程技术总结(异步)
  4. 20155204 2016-2017-2《Java程序设计》课程总结
  5. centos6.5安装配置zabbix3.0.3
  6. ubuntu zip解压
  7. java 使用json-lib 对象,String,json互转
  8. jstl与EL表达式处理字符串
  9. JVM学习笔记-03-类加载器及双亲委派机制
  10. 操作系统学习笔记-2.1.3进程控制