Docker构建Python Flask项目时Chromadb安装失败求助
问题描述
构建Python Flask项目Docker镜像时,执行RUN pip install chromadb步骤失败,提示无法为duckdb、hnswlib构建wheel,根源是编译器不支持C++11。
原Dockerfile内容
FROM python:3.10-slim-buster ENV HNSWLIB_NO_NATIVE=1 RUN mkdir /app WORKDIR /app COPY . /app RUN pip install --upgrade pip setuptools RUN pip install -r requirements.txt RUN export HNSWLIB_NO_NATIVE=1 RUN pip install chromadb EXPOSE 5000 CMD python ./app.py
错误信息
Building wheel for hnswlib (pyproject.toml) did not run successfully. #0 9.427 │ exit code: 1 #0 9.427 ╰─> [55 lines of output] #0 9.427 running bdist_wheel #0 9.427 running build #0 9.427 running build_ext #0 9.427 creating tmp #0 9.427 gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/usr/local/include/python3.10 -c /tmp/tmpohs_vaib.cpp -o tmp/tmpohs_vaib.o -std=c++14 #0 9.427 gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/usr/local/include/python3.10 -c /tmp/tmp1os2pqqf.cpp -o tmp/tmp1os2pqqf.o -std=c++11 #0 9.427 Traceback (most recent call last): #0 9.427 File "/usr/local/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 353, in <module> #0 9.427 main() #0 9.427 File "/usr/local/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 335, in main #0 9.427 json_out['return_val'] = hook(**hook_input['kwargs']) #0 9.427 File "/usr/local/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 251, in build_wheel #0 9.427 return _build_backend().build_wheel(wheel_directory, config_settings, #0 9.427 File "/tmp/pip-build-env-o2mbvvt6/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 416, in build_wheel #0 9.427 return self._build_with_temp_dir(['bdist_wheel'], '.whl', #0 9.427 File "/tmp/pip-build-env-o2mbvvt6/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 401, in _build_with_temp_dir #0 9.427 self.run_setup() #0 9.427 File "/tmp/pip-build-env-o2mbvvt6/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 338, in run_setup #0 9.427 exec(code, locals()) #0 9.427 File "<string>", line 116, in <module> #0 9.427 File "/tmp/pip-build-env-o2mbvvt6/overlay/lib/python3.10/site-packages/setuptools/__init__.py", line 107, in setup #0 9.427 return distutils.core.setup(**attrs) #0 9.427 File "/tmp/pip-build-env-o2mbvvt6/overlay/lib/python3.10/site-packages/setuptools/_distutils/core.py", line 185, in setup #0 9.427 return run_commands(dist) #0 9.427 File "/tmp/pip-build-env-o2mbvvt6/overlay/lib/python3.10/site-packages/setuptools/_distutils/core.py", line 201, in run_commands #0 9.427 dist.run_commands() #0 9.427 File "/tmp/pip-build-env-o2mbvvt6/overlay/lib/python3.10/site-packages/setuptools/_distutils/dist.py", line 969, in run_commands #0 9.427 self.run_command(cmd) #0 9.427 File "/tmp/pip-build-env-o2mbvvt6/overlay/lib/python3.10/site-packages/setuptools/dist.py", line 1244, in run_command #0 9.427 super().run_command(command) #0 9.427 File "/tmp/pip-build-env-o2mbvvt6/overlay/lib/python3.10/site-packages/setuptools/_distutils/dist.py", line 988, in run_command #0 9.427 cmd_obj.run() #0 9.427 File "/tmp/pip-build-env-o2mbvvt6/overlay/lib/python3.10/site-packages/wheel/bdist_wheel.py", line 343, in run #0 9.427 self.run_command("build") #0 9.427 File "/tmp/pip-build-env-o2mbvvt6/overlay/lib/python3.10/site-packages/setuptools/_distutils/cmd.py", line 318, in run_command #0 9.427 self.distribution.run_command(command) #0 9.427 File "/tmp/pip-build-env-o2mbvvt6/overlay/lib/python3.10/site-packages/setuptools/dist.py", line 1244, in run_command #0 9.427 super().run_command(command) #0 9.427 File "/tmp/pip-build-env-o2mbvvt6/overlay/lib/python3.10/site-packages/setuptools/_distutils/dist.py", line 988, in run_command #0 9.427 cmd_obj.run() #0 9.427 File "/tmp/pip-build-env-o2mbvvt6/overlay/lib/python3.10/site-packages/setuptools/_distutils/command/build.py", line 131, in run #0 9.427 self.run_command(cmd_name) #0 9.427 File "/tmp/pip-build-env-o2mbvvt6/overlay/lib/python3.10/site-packages/setuptools/_distutils/cmd.py", line 318, in run_command #0 9.427 self.distribution.run_command(command) #0 9.427 File "/tmp/pip-build-env-o2mbvvt6/overlay/lib/python3.10/site-packages/setuptools/dist.py", line 1244, in run_command #0 9.427 super().run_command(command) #0 9.427 File "/tmp/pip-build-env-o2mbvvt6/overlay/lib/python3.10/site-packages/setuptools/_distutils/dist.py", line 988, in run_command #0 9.427 cmd_obj.run() #0 9.427 File "/tmp/pip-build-env-o2mbvvt6/overlay/lib/python3.10/site-packages/setuptools/command/build_ext.py", line 84, in run #0 9.427 _build_ext.run(self) #0 9.427 File "/tmp/pip-build-env-o2mbvvt6/overlay/lib/python3.10/site-packages/setuptools/_distutils/command/build_ext.py", line 345, in run #0 9.427 self.build_extensions() #0 9.427 File "<string>", line 103, in build_extensions #0 9.427 File "<string>", line 70, in cpp_flag #0 9.427 RuntimeError: Unsupported compiler -- at least C++11 support is needed! #0 9.427 [end of output] #0 9.427 #0 9.427 note: This error originates from a subprocess, and is likely not a problem with pip. #0 9.427 ERROR: Failed building wheel for hnswlib #0 9.428 Failed to build duckdb hnswlib #0 9.428 ERROR: Could not build wheels for duckdb, hnswlib, which is required to install pyproject.toml-based projects ------ Dockerfile:15 -------------------- 13 | RUN export HNSWLIB_NO_NATIVE=1 14 | 15 | >>> RUN pip install chromadb 16 | 17 | EXPOSE 5000 -------------------- ERROR: failed to solve: process "/bin/sh -c pip install chromadb" did not complete successfully: exit code: 1
解决方案
1. 安装完整编译工具链
python:slim-buster镜像默认仅包含最小化依赖,缺少支持C11的编译器工具。需安装build-essential包,它包含gcc、g、make等必要工具,满足C++11编译需求。
2. 修复环境变量生效问题
原Dockerfile中RUN export HNSWLIB_NO_NATIVE=1仅在当前shell进程生效,后续pip install命令无法继承该变量。直接用ENV全局设置即可让所有后续命令生效。
3. 优化Dockerfile减少镜像层数
合并多个RUN命令,减少镜像构建层数,同时清理安装缓存减小镜像体积。
修改后的Dockerfile
FROM python:3.10-slim-buster # 全局设置环境变量,禁用hnswlib的本地编译 ENV HNSWLIB_NO_NATIVE=1 # 安装编译工具链,升级pip并清理缓存 RUN apt-get update && \ apt-get install -y --no-install-recommends build-essential && \ pip install --upgrade pip setuptools && \ rm -rf /var/lib/apt/lists/* RUN mkdir /app WORKDIR /app COPY . /app # 合并依赖安装命令,减少镜像层数 RUN pip install -r requirements.txt && \ pip install chromadb EXPOSE 5000 CMD python ./app.py
额外说明
--no-install-recommends参数避免安装不必要的依赖,减小镜像体积。rm -rf /var/lib/apt/lists/*清理apt缓存,进一步压缩镜像大小。- 若仍有问题,可尝试指定chromadb的兼容版本,或检查requirements.txt中是否存在冲突依赖。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

