You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

问题根源

  1. pyarrow版本冲突:req.txt中指定pyarrow>=7.0.0,安装后系统中已有某个符合条件的pyarrow版本;但turbodbc的构建过程会在隔离环境中下载依赖的pyarrow 9.0.0版本,导致两个版本的pyarrow路径冲突,干扰编译流程。
  2. 旧版setuptools兼容性问题:Dockerfile中固定了setuptools==45.2.0,该版本发布于2020年,与后续更新的依赖包(如pyarrow、turbodbc)可能存在兼容性问题,导致构建wheel失败。
  3. 基础镜像潜在更新:即使未主动修改基础设施,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:50:53