Ubuntu Docker容器中用PyEnv安装Python3.6.8失败:段错误与libffi缺失
在Ubuntu 24.04容器中用PyEnv安装Python3.6.8时出现段错误的解决方法
问题背景
基于Ubuntu最新镜像(24.04)创建Docker容器,通过PyEnv成功安装Python3.8.10,但安装Python3.6.8时触发段错误,导致pip安装失败。
重现步骤
- 启动Docker容器:
docker run -it --label 'python-envs' -v ~/Desktop/python-envs/:/workspace/python-envs:rw --hostname python --name python-envs ubuntu:latest - 查看系统信息:
输出:uname -aLinux python 6.5.0-35-generic #35~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue May 7 09:00:52 UTC 2 x86_64 x86_64 x86_64 GNU/Linux - 安装PyEnv:
curl https://pyenv.run | bash - 验证已安装版本:
输出:pyenv versions* system (set by /root/.pyenv/version) 3.8.10 - 安装依赖库:
apt install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev - 尝试安装Python3.6.8:
pyenv install 3.6.8
错误信息
Downloading Python-3.6.8.tar.xz... -> https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz Installing Python-3.6.8... /root/.pyenv/plugins/python-build/bin/python-build: line 1863: 30193 Segmentation fault (core dumped) "$PYTHON_BIN" -c "import $1" WARNING: The Python ctypes extension was not compiled. Missing the libffi lib? /root/.pyenv/plugins/python-build/bin/python-build: line 2089: 30200 Segmentation fault (core dumped) "$PYTHON_BIN" $python_opts -m ensurepip ${ensurepip_opts} > /dev/null 2>&1 Installing pip from https://bootstrap.pypa.io/pip/3.6/get-pip.py... /root/.pyenv/plugins/python-build/bin/python-build: line 2065: 30204 Segmentation fault (core dumped) "${PYTHON_BIN}" -s "${get_pip}" ${GET_PIP_OPTS} 1>&4 2>&1 error: failed to install pip via get-pip.py BUILD FAILED (Ubuntu 24.04 using python-build 20180424) Inspect or clean up the working tree at /tmp/python-build.20240612063012.18758 Results logged to /tmp/python-build.20240612063012.18758.log Last 10 log lines: install|*) ensurepip="" ;; \ esac; \ LD_LIBRARY_PATH=/tmp/python-build.20240612063012.18758/Python-3.6.8 ./python -E -m ensurepip \ $ensurepip --root=/ ; \ fi Looking in links: /tmp/tmpm_fdsrq7 Collecting setuptools Collecting pip Installing collected packages: setuptools, pip Successfully installed pip-18.1 setuptools-40.6.2
已尝试的解决方法
- 执行
pyenv uninstall 3.6.8清理之前的安装残留 - 设置编译环境变量:
CFLAGS="-O2 -D_FORTIFY_SOURCE=2 -fstack-protector-strong -fno-plt \ -Wformat -Werror=format-security -fPIC" \ LDFLAGS="-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed" \
原因分析
Python3.6.8是发布于2019年的老旧版本,而Ubuntu 24.04使用的GCC 13.x编译器、glibc库等系统组件版本较新。新编译器的安全特性、优化逻辑与旧Python版本的源码兼容性存在冲突,导致运行时触发段错误;同时Python3.6.8的部分代码逻辑无法适配新系统的库函数,也是问题诱因之一。
可行解决方案
方案1:使用低版本Ubuntu镜像
改用Ubuntu 20.04或18.04镜像构建容器,这些版本的编译器和系统库与Python3.6.8兼容性更好,启动容器命令修改为:
docker run -it --label 'python-envs' -v ~/Desktop/python-envs/:/workspace/python-envs:rw --hostname python --name python-envs ubuntu:20.04
方案2:调整编译参数关闭部分新编译器特性
安装Python3.6.8时,使用更宽松的编译参数,关闭导致兼容性问题的安全选项:
CFLAGS="-O2 -fPIC" \ LDFLAGS="-Wl,-z,relro" \ pyenv install 3.6.8
若仍存在OpenSSL兼容问题,可添加补丁参数:
CFLAGS="-O2 -fPIC" \ LDFLAGS="-Wl,-z,relro" \ pyenv install --patch 3.6.8 <(curl -sSL https://github.com/python/cpython/commit/8ea6353.patch)
方案3:使用pyenv补丁插件适配新系统
安装pyenv-patch插件,为Python3.6.8应用适配Ubuntu 24.04的补丁:
git clone https://github.com/kenji-miyake/pyenv-patch.git $(pyenv root)/plugins/pyenv-patch
然后应用OpenSSL适配补丁:
pyenv install --patch 3.6.8 <(curl -sSL https://raw.githubusercontent.com/deadsnakes/python3.6/master/debian/patches/openssl-1.1.1.patch)
方案4:直接使用官方Python3.6.8容器镜像
若无需在同一容器中多版本共存,可直接使用官方Python3.6镜像:
docker run -it --label 'python-envs' -v ~/Desktop/python-envs/:/workspace/python-envs:rw --hostname python --name python-envs python:3.6.8-slim-buster
内容的提问来源于stack exchange,提问作者Ilgar
相关产品推荐
相关产品推荐

