如何在基础镜像中安装指定python版本

背景

由于规范要求要使用指定的镜像版本,但是由于该镜像中的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

posted @ 2022-09-18 01:23  Klay_zhu  阅读(1099)  评论(0编辑  收藏  举报