背景
由于规范要求要使用指定的镜像版本,但是由于该镜像中的python与我使用的版本有差异,怕引起一些不必要的兼容问题,所以我需要自己按基础镜像基础上安装对应版本的python。
Dockerfile
直接上最终dockerfile,为什么这样写,后面说到。
FROM centos:7
# 指定工作目录
WORKDIR /work
ARG PYTHON_VERSION=3.8.14
ENV WORK_PATH=/work
COPY Python-$PYTHON_VERSION.tgz .
# 安装python相关的依赖和编译环境
RUN set -ex \
&& yum -y install zlib-devel bzip2-devel libffi-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel gcc make\
&& yum clean all \
&& tar --extract -f $WORK_PATH/Python-$PYTHON_VERSION.tgz \
&& cd $WORK_PATH/Python-$PYTHON_VERSION/ \
&& mkdir /usr/local/python3 \
# && ./configure --prefix=/usr/local/python3 --enable-optimizations \ #有bug不能加 --enable-optimizations
&& ./configure --prefix=/usr/local/python3 \
&& make clean \
&& make && make install \
&& ln -s /usr/local/python3/bin/python3 /usr/bin/python3 \
&& ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 \
# 开始删除垃圾
&& rm -r $WORK_PATH/Python-$PYTHON_VERSION* \
&& yum -y remove zlib-devel bzip2-devel libffi-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel gcc make \
# 打印python 版本 和 pip版本
&& python3 --version \
&& pip3 -V \
优化过程
增加变量PYTHON_VERSION
使用PYTHON_VERSION来定义版本,这样有个好处就是后续如果要更新,换其他版本的python,修改该字段即可,而不用全局改很多地方。
...
ARG PYTHON_VERSION=3.8.14
ENV WORK_PATH=/work
COPY Python-$PYTHON_VERSION.tgz .
# 安装python相关的依赖和编译环境
RUN set -ex \
....
&& tar --extract -f $WORK_PATH/Python-$PYTHON_VERSION.tgz \
&& cd $WORK_PATH/Python-$PYTHON_VERSION/ \
...
# 开始删除垃圾
&& rm -r $WORK_PATH/Python-$PYTHON_VERSION* \
...
命令集中
一条命令是一层,这样的好处整个docker就不会分多层,如果这段没有被修改,再次build的时候会加速
删除编译工具和安装文件
没删除这些的时候538M
删除后329M,直接减少了差不多200M
总结
官方提供的python镜像在alpine3.16基础上只加了几十M,人麻了。
参考:
https://blog.csdn.net/dragoo1/article/details/120403364
https://blog.csdn.net/lian01110a/article/details/120467814