定制基础Python镜像
虽说python基础镜像网上很多,但是每次换一个基础镜像就需要仔细分析一下他的文件结构,而且很怕踩坑。所以决定定制一个自己的基础镜像,这样各方面都比较有把握。
基于centos7.5的python镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| FROM centos:7.5.1804 MAINTAINER uncleY <uncleY@qq.com> ENV PATH $PATH:/usr/local/python3/bin/ ENV PYTHONIOENCODING utf-8 RUN set -ex \ # 替换yum源 && mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup \ && curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo \ && sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo \ # 安装python依赖库 && yum makecache \ && yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make wget \ && yum clean all \ && rm -rf /var/cache/yum \ # 下载安装python3 && wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz \ && mkdir -p /usr/local/python3 \ && tar -zxvf Python-3.6.4.tgz \ && cd Python-3.6.4 \ && ./configure --prefix=/usr/local/python3 \ && make && make install && make clean \ # 修改pip默认镜像源 && mkdir -p ~/.pip \ && echo '[global]' > ~/.pip/pip.conf \ && echo 'index-url = https://pypi.tuna.tsinghua.edu.cn/simple' >> ~/.pip/pip.conf \ && echo 'trusted-host = pypi.tuna.tsinghua.edu.cn' >> ~/.pip/pip.conf \ && echo 'timeout = 120' >> ~/.pip/pip.conf \ # 更新pip && pip3 install --upgrade pip \ # 安装wheel && pip3 install wheel \ # 删除安装包 && cd .. \ && rm -rf /Python* \ && find / -name "*.py[co]" -exec rm '{}' ';' \ # 设置系统时区 && rm -rf /etc/localtime \ && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
|
我已经验证过了,脚本可行。

最终生成镜像大小:454MB,感觉还好。虽然alpine镜像很小,只有90M。但是很坑,用过的都知道,要排查问题的时候要啥啥没有。
Alpine的致命问题:标准的Linux安装包在Alpine Linux上根本无法使用。
大多数Linux发行版都使用GNU版本的标准C库(glibc),几乎所有基于C语言的脚本语言都需要这个库,包括Python。但Alpine Linux使用的是musl,那些二进制安装包是针对glibc编译的,因此Alpine禁用了Linux安装包支持。现在大多数Python包都在PyPI上包含了二进制安装包,大大加快了安装时间。但是如果你使用的是Alpine Linux,你需要编译你使用的每一个Python包中的所有C源码。
Alpine的线程默认堆栈容量较小,这会导致Python崩溃,同时也会影响python应用的运行速度。
使用
然后我们就可以基于此基础镜像,再打我们的代码
1 2 3 4 5
| FROM harbor-test.xxx.net/dts/python:3.6.4 COPY src /src/ RUN pip3 install -r /src/requirements.txt EXPOSE 5000 ENTRYPOINT [ "python3", "/src/app.py" ]
|
关于制作镜像的建议:
0、set -ex,作用是当命令发生错误的时候,停止脚本的执行
1、RUN中尽量使用 \ &&连接命令的方式,减少镜像层数,可以一定程度减少体积。
2、尽可能删除不需要的文件,也是为了减少镜像体积。
3、Python默认不安装wheel,但是第三方库常需要使用wheel安装,所以加上它。如果你不需要,可以删掉。
4、docker运行时程序获取系统时间时,如打印日志等,获取的是docker镜像内文件系统的时区设置,默认是格林尼治标准时区,所以需要设置为所在的时区。