1、简介
在使用pyinstaller打包工具打包应用为二进制的时候,出现了一个“”: dlopen: /lib64/libc.so.6: version `GLIBC_2.28'”的问题
2、解决方案
2.1、问题原因
由于使用了官方提供的镜像,而官方提供的镜像编译的机器上、glibc的版本过高,完整报错如下:
[PYI-13721:ERROR] Failed to load Python shared library '/tmp/_MEIs9j8Ws/libpython3.8.so.1.0': dlopen: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by /tmp/_MEIs9j8Ws/libpython3.8.so.1.0)
在排查时,可以通过以下命令查看glibc的版本
ldd --version
如果在glibc 2.28版本中构建的二进制,在glibc 2.17版本的机器中执行,那么就会出现问题,所以这个时候就需要自己构建python3版本的容器(python的版本,取决于自己编写代码的版本)
2.2、 解决方式
2.2.1 宿主机中安装python
# 由于 centos中的源被禁了,下载阿里的源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 清理缓存、创建新的缓存
yum clean all
yum makecache
# 更新本机的库
yum -y update
# 安装python编译安装时候的依赖
yum -y install zlib-devel bzip2-devel openssl-devel openssl-static ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel lzma gcc wget make
# 进入 /usr/local
cd /usr/local
# 下载python的版本
wget https://www.python.org/ftp/python/3.8.10/Python-3.8.10.tar.xz
# 解压python的安装包
tar -xvJf Python-3.8.10.tar.xz
# 创建要安装python的目录
mkdir /usr/local/python3
# 进入解压出来的安装包
cd /usr/local/Python-3.8.10
# --prefix用来指定安装的目录,也就是上一步已创建的目录/usr/local/python3
./configure --prefix=/usr/local/python3 --enable-shared
# --enable-shared 是为了启用共享库的生成,如果不生成它,在使用pyinstaller的时候,会报错
# 源码安装
make && make install
# 创建软连接
ln -s /usr/local/python3/bin/python3 /usr/local/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip3
# 更新系统的共享库缓存,确保程序运行时能够正确找到所需的动态链接库
echo "/usr/local/python3/lib/" >> /etc/ld.so.conf
ldconfig
执行上面的命令后,python3.8.10版本编译安装成功,接下来可以通过创建虚拟环境等命令使用python了
cd /myproject-code
python3 -m venv myvenv
# 激活python虚拟环境
source myvenv/bin/activate
#使用完成后,可以使用如下命令退出虚拟环境
deactivate
2.2.2 通过dockerfile、构建python容器
第一步:获取基础镜像
docker pull centos:centos7.9.2009
# 如果镜像无法下载,执行以下命令(注:如果daemon.json存在手动添加)
cat > /etc/docker/daemon.json << EOF
{
"experimental": true,
"registry-mirrors": [
"https://docker.1ms.run",
"https://hub.rat.dev",
"https://docker.1panel.live"
]
}
EOF
systemctl restart docker
第二步:编写dockerfile 如下:
FROM centos:centos7.9.2009
LABEL author=ncjx
ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
yum clean all && \
yum makecache && \
yum -y update && \
yum -y install zlib-devel bzip2-devel openssl-devel openssl-static ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel lzma gcc wget make && \
cd /usr/local && \
wget https://www.python.org/ftp/python/3.8.10/Python-3.8.10.tar.xz && \
tar -xvJf Python-3.8.10.tar.xz && \
mkdir /usr/local/python3 && \
cd /usr/local/Python-3.8.10 && \
./configure --prefix=/usr/local/python3 --enable-shared && \
make && make install && \
ln -s /usr/local/python3/bin/python3 /usr/local/bin/python3 && \
ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip3 && \
echo "/usr/local/python3/lib/" >> /etc/ld.so.conf && \
ldconfig
WORKDIR /home
CMD ["/usr/sbin/init"]
第三步:构建镜像
docker build -f dockerfile -t ncjx-python3.8:latest .