源码构建 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