Docker构建安装turbodbc失败排查求助
Docker构建失败:turbodbc安装报错与pyarrow路径冲突
问题描述
一周前可正常构建的Dockerfile,未改动应用代码与基础设施的前提下,当前执行Docker构建时安装turbodbc==4.5.3失败,报错subprocess-exited-with-error,同时出现pyarrow模块路径冲突警告。
相关配置文件
Dockerfile
# FROM python:3.9-slim # FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9-slim FROM tiangolo/meinheld-gunicorn-flask:python3.9 # Tell Python to not generate .pyc ENV PYTHONDONTWRITEBYTECODE 1 # Turn off buffering ENV PYTHONUNBUFFERED 1 RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ && apt-get -y install --no-install-recommends \ build-essential \ default-libmysqlclient-dev \ libpython3-dev \ libboost-all-dev \ python3-wheel \ python3-dev \ software-properties-common \ libsasl2-modules-gssapi-mit \ libsasl2-modules \ unixodbc \ unixodbc-dev \ odbc-postgresql \ tdsodbc CMD gunicorn --bind :2090 --workers 4 --threads 8 main:app --log-level debug --timeout 0 RUN wget -O mysql-connector-odbc-8.0.12-linux-debian9-x86-64bit.tar.gz https://github.com/ubisoft/mobydq/blob/master/scripts/drivers/mysql-connector-odbc-8.0.12-linux-debian9-x86-64bit.tar.gz?raw=true && \ tar -xvzf mysql-connector-odbc-8.0.12-linux-debian9-x86-64bit.tar.gz \ && cp mysql-connector-odbc-8.0.12-linux-debian9-x86-64bit/lib/libmyodbc8* /usr/lib/x86_64-linux-gnu/odbc/ \ && rm -R mysql-connector-odbc-8.0.12-linux-debian9-x86-64bit # Install requirements using pip ADD req.txt . RUN \ apt-get update --yes && \ pip install -U pip==22.0.4 setuptools==45.2.0 wheel==0.37.1 && \ apt-get install curl sudo git make musl-dev --yes && \ pip install -r req.txt && \ python -c "import pyarrow; pyarrow.create_library_symlinks()" && \ CFLAGS="-D_GLIBCXX_USE_CXX11_ABI=0" pip install --no-cache-dir turbodbc==4.5.3 && \ apt-get remove make gcc musl-dev libffi-dev --yes &&\ apt-get clean autoclean && apt-get autoremove --yes && \ rm -rf /var/lib/{apt,dpkg,cache,log}/ COPY ./odbcinst.ini /etc/ # Set working directory WORKDIR /app # Copy files ADD ./API /app ENV PORT=2090 EXPOSE 2090
req.txt
boto3 botocore cachetools==5.0.0 certifi==2021.10.8 charset-normalizer==2.0.12 fastapi==0.65.2 Flask==2.0.3 Flask-Cors==3.0.10 Flask-Ext==0.1 flask-restplus==0.13.0 Flask-Session==0.4.0 duckdb google-api-core==2.7.2 google-auth==2.6.6 google-cloud-core==2.3.0 google-cloud-storage==2.3.0 google-crc32c==1.3.0 google-resumable-media==2.3.2 googleapis-common-protos==1.56.0 idna==3.3 jmespath==1.0.0 numpy==1.21.6 pandas==1.3.5 pydantic==1.8.2 protobuf==3.20.1 pyparsing==2.4.7 pytest==6.2.4 psycopg2-binary==2.9.1 pytest-cov==2.12.1 python-dotenv==0.17.1 python-jenkins==1.7.0 python-multipart==0.0.5 PyYAML==5.4.1 pyasn1==0.4.8 pyasn1-modules==0.2.8 pymongo python-dateutil==2.8.2 pytz==2022.1 requests==2.27.1 rsa==4.8 s3path s3transfer==0.5.2 s3fs==2022.3.0 six==1.16.0 urllib3==1.26.9 vaex vaex-arrow typing-extensions==3.10.0.0 uvicorn==0.14.0 uvloop==0.14.0 watchgod==0.7 websockets==9.1 wrapt==1.12.1 Werkzeug zipp==3.4.1 pyarrow>=7.0.0 pyodbc==4.0.34
错误信息(翻译后)
准备元数据(setup.py): 开始 准备元数据(setup.py): 完成,状态为'done' 为收集到的包构建wheel: turbodbc 为turbodbc构建wheel(setup.py): 开始 为turbodbc构建wheel(setup.py): 运行中... 为turbodbc构建wheel(setup.py): 运行中... 为turbodbc构建wheel(setup.py): 运行中... 为turbodbc构建wheel(setup.py): 运行中... 为turbodbc构建wheel(setup.py): 完成,状态为'error' 错误: subprocess-exited-with-error × python setup.py bdist_wheel 运行失败。 │ 退出码: 1 ╰─> [1248行输出] /usr/local/lib/python3.9/site-packages/setuptools/dist.py:724: 用户警告: pyarrow模块已从/usr/local/lib/python3.9/site-packages/pyarrow/__init__.py导入,但/tmp/pip-install-64lv0rpv/turbodbc_99cb81698f1444109a3d8faae1e53b9b/.eggs/pyarrow-9.0.0-py3.9-linux-x86_64.egg 正被添加到sys.path pkg_resources.working_set.add(dist, replace=True)
问题根源
- pyarrow版本冲突:
req.txt中指定pyarrow>=7.0.0,安装后系统中已有某个符合条件的pyarrow版本;但turbodbc的构建过程会在隔离环境中下载依赖的pyarrow 9.0.0版本,导致两个版本的pyarrow路径冲突,干扰编译流程。 - 旧版setuptools兼容性问题:Dockerfile中固定了
setuptools==45.2.0,该版本发布于2020年,与后续更新的依赖包(如pyarrow、turbodbc)可能存在兼容性问题,导致构建wheel失败。 - 基础镜像潜在更新:即使未主动修改基础设施,
tiangolo/meinheld-gunicorn-flask:python3.9作为滚动tag镜像,可能已被更新到新的版本,镜像内的系统库或依赖环境发生了变化。
修复方案
方案1:跳过构建隔离安装turbodbc
修改Dockerfile中安装turbodbc的命令,添加--no-build-isolation参数,让pip直接使用当前环境已安装的pyarrow,避免重新下载冲突版本:
CFLAGS="-D_GLIBCXX_USE_CXX11_ABI=0" pip install --no-cache-dir --no-build-isolation turbodbc==4.5.3
方案2:固定pyarrow版本
在req.txt中将pyarrow>=7.0.0改为固定版本pyarrow=9.0.0,与turbodbc构建时依赖的版本保持一致,消除冲突:
# 替换原pyarrow行 pyarrow=9.0.0
方案3:升级setuptools版本
将Dockerfile中的setuptools版本更新到更兼容的版本,比如65.5.0(与pip 22.0.4兼容):
pip install -U pip==22.0.4 setuptools==65.5.0 wheel==0.37.1
方案4:固定基础镜像tag
避免使用滚动tag的基础镜像,改用带有具体版本或哈希的固定tag,确保每次构建使用相同的环境:
# 示例:使用带日期的固定tag,可从Docker Hub查询对应python3.9的具体tag FROM tiangolo/meinheld-gunicorn-flask:python3.9-2023-02-02
内容的提问来源于stack exchange,提问作者Muhammad Areeb Siddiqui
相关产品推荐
相关产品推荐

