hello云胜

技术与生活

0%

定制基础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

我已经验证过了,脚本可行。

image-20230906153448942

最终生成镜像大小: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镜像内文件系统的时区设置,默认是格林尼治标准时区,所以需要设置为所在的时区。