源码构建 Python 遇到的问题

2022/07/20

源码构建 Python 遇到的问题

最近调整项目组用到的基础 docker 镜像,镜像基于 CentOS6 ,因为过于老旧,要换到 CentOS7 ,其中 dockerfile 有一层是从源码编译 Python2.7.14 然后替换系统内的 Python ,最后验证 python -V 我发现版本并没有更新。

简化后的 Dockerfile 如下:

FROM centos:7

RUN yum update -y; \
	yum install -y \
		make build-essential \
		wget curl gcc g++ \
		libssl-dev \
		zlib1g-dev \
		libbz2-dev \
		libreadline-dev \
		libsqlite3-dev \
		libncurses5-dev \
		libncursesw5-dev \
		xz-utils \
		tk-dev \
    ;

ENV PYTHON_VERSION 2.7.14
RUN wget https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz && \
  tar xvf Python-${PYTHON_VERSION}.tgz && \
  cd Python-${PYTHON_VERSION} && \
  ./configure --enable-shared && \
  make -j$(grep -c processor /proc/cpuinfo) && \
  make install && \
  ldconfig && \
  cd .. && rm -rf Python-${PYTHON_VERSION}*
RUN mv /usr/bin/python2.7 /usr/bin/python2.7.5 && \
    ln -s /usr/local/bin/python2.7 /usr/bin/python2.7
# missing here...

CMD [ "python", "-V" ]

构建后检查 python 版本

docker build -t test .
docker run --rm test
# 输出 Python 2.7.5

版本没有变,原因是 ./configure --enable-shared 让编译后的 Python 会优先查找系统中的动态链接库,也就找到了旧版本的。

在编译完成后加上以下几句,使用新的动态链接库的路径,就可以了:

RUN echo "/usr/local/lib/python2.7" > /etc/ld.so.conf.d/python27.conf
RUN echo "/usr/local/lib" >> /etc/ld.so.conf.d/python27.conf
RUN ldconfig

参考