Docker中安装OpenCV遇编译错误,寻求解决方案
问题:Docker构建Silvicek/baselines仓库时OpenCV编译失败
尝试在Docker中构建并安装Silvicek/baselines仓库,执行pip3 install -e .命令时触发OpenCV编译错误,具体信息如下:
Dockerfile内容
FROM tensorflow/tensorflow:1.14.0-gpu-py3 ENV TZ="America/Los_Angeles" ARG DEBIAN_FRONTEND=noninteractive RUN rm /etc/apt/sources.list.d/cuda.list && \ rm /etc/apt/sources.list.d/nvidia-ml.list && \ apt-key del 7fa2af80 && \ apt-get update && apt-get install -y --no-install-recommends wget && \ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-keyring_1.0-1_all.deb && \ dpkg -i cuda-keyring_1.0-1_all.deb && \ apt-get update RUN apt-get install -y git python3-opencv RUN mkdir /build COPY baselines/ /build/baselines WORKDIR /build/baselines RUN ls -lrt /build RUN ls -lrt /build/baselines RUN pip3 install --upgrade pip setuptools wheel RUN pip3 install -e . -vvv
构建命令
docker build -f dockerfile --progress=plain -t dist_dqn .
错误信息
错误块1:类型解析与绑定生成警告
#14 1702.8 [100%] Generate files for Python bindings and documentation #14 1704.0 /tmp/pip-install-jdnrgs2i/opencv-python_a75af04f83144d719ab5328e2c3bcd30/opencv/modules/ python/src2/typing_stubs_generator.py:54: UserWarning: Typing stubs generation has failed. #14 1704.0 Traceback (most recent call last): #14 1704.0 File "/tmp/pip-install-jdnrgs2i/opencv-python_a75af04f83144d719ab5328e2c3bcd30/opencv/ modules/python/src2/typing_stubs_generation/nodes/type_node.py", line 291, in resolve #14 1704.0 self.value.resolve(root) #14 1704.0 File "/tmp/pip-install-jdnrgs2i/opencv-python_a75af04f83144d719ab5328e2c3bcd30/opencv/ modules/python/src2/typing_stubs_generation/nodes/type_node.py", line 628, in resolve #14 1704.0 self.full_typename, errors #14 1704.0 typing_stubs_generation.nodes.type_node.TypeResolutionError: Failed to resolve one of "_ typing.Union[cv2.typing.Scalar, GMat, GOpaqueT, GArrayT]" items. Errors: ['Failed to resolve "GMat" e xposed as "GMat"', 'Failed to resolve "GOpaqueT" exposed as "GOpaqueT"', 'Failed to resolve "GArrayT" exposed as "GArrayT"'] #14 1704.0 #14 1704.0 The above exception was the direct cause of the following exception: #14 1704.0 #14 1704.0 Traceback (most recent call last): #14 1704.0 File "/tmp/pip-install-jdnrgs2i/opencv-python_a75af04f83144d719ab5328e2c3bcd30/opencv/ modules/python/src2/typing_stubs_generator.py", line 49, in wrapped_func #14 1704.0 ret_type = func(*args, **kwargs) #14 1704.0 File "/tmp/pip-install-jdnrgs2i/opencv-python_a75af04f83144d719ab5328e2c3bcd30/opencv/ modules/python/src2/typing_stubs_generator.py", line 148, in _generate #14 1704.0 generate_typing_stubs(self.cv_root, output_path) #14 1704.0 File "/tmp/pip-install-jdnrgs2i/opencv-python_a75af04f83144d719ab5328e2c3bcd30/opencv/ modules/python/src2/typing_stubs_generation/generation.py", line 91, in generate_typing_stubs #14 1704.0 _generate_typing_module(root, output_path) #14 1704.0 File "/tmp/pip-install-jdnrgs2i/opencv-python_a75af04f83144d719ab5328e2c3bcd30/opencv/ modules/python/src2/typing_stubs_generation/generation.py", line 794, in _generate_typing_module #14 1704.0 node.resolve(root) #14 1704.0 File "/tmp/pip-install-jdnrgs2i/opencv-python_a75af04f83144d719ab5328e2c3bcd30/opencv/ modules/python/src2/typing_stubs_generation/nodes/type_node.py", line 297, in resolve #14 1704.0 ) from e #14 1704.0 typing_stubs_generation.nodes.type_node.TypeResolutionError: Failed to resolve alias "GP rotoArg" exposed as "GProtoArg" #14 1704.0 #14 1704.0 traceback.format_exc() #14 1704.0 Note: Class cv::Feature2D has more than 1 base class (not supported by Python C extensio ns) #14 1704.0 Bases: cv::Algorithm, cv::class, cv::Feature2D, cv::Algorithm #14 1704.0 Only the first base class will be used #14 1704.0 Note: Class cv::detail::GraphCutSeamFinder has more than 1 base class (not supported by Python C extensions) #14 1704.0 Bases: cv::detail::GraphCutSeamFinderBase, cv::detail::SeamFinder #14 1704.0 [100%] Built target gen_opencv_python_source #14 1704.1 [100%] Building CXX object modules/python3/CMakeFiles/opencv_python3.dir/__/src2/cv2.cpp .o #14 1779.0 [100%] Building CXX object modules/python3/CMakeFiles/opencv_python3.dir/__/src2/cv2_uti l.cpp.o #14 1780.1 [100%] Building CXX object modules/python3/CMakeFiles/opencv_python3.dir/__/src2/cv2_num py.cpp.o #14 1781.1 [100%] Building CXX object modules/python3/CMakeFiles/opencv_python3.dir/__/src2/cv2_con vert.cpp.o #14 1782.7 [100%] Building CXX object modules/python3/CMakeFiles/opencv_python3.dir/__/src2/cv2_hig hgui.cpp.o #14 1783.9 [100%] Linking CXX shared module ../../lib/python3/cv2.cpython-36m-x86_64-linux-gnu.so #14 1787.9 [100%] Built target opencv_python3
错误块2:文件复制失败导致构建终止
#14 1788.3 Copying files from CMake output #14 1788.3 Traceback (most recent call last): #14 1788.3 File "/usr/local/lib/python3.6/dist-packages/pip/_vendor/pep517/in_process/_in_process .py", line 363, in <module> #14 1788.3 main() #14 1788.3 File "/usr/local/lib/python3.6/dist-packages/pip/_vendor/pep517/in_process/_in_process .py", line 345, in main #14 1788.3 json_out['return_val'] = hook(**hook_input['kwargs']) #14 1788.3 File "/usr/local/lib/python3.6/dist-packages/pip/_vendor/pep517/in_process/_in_process .py", line 262, in build_wheel #14 1788.3 metadata_directory) #14 1788.3 File "/usr/local/lib/python3.6/dist-packages/setuptools/build_meta.py", line 231, in b uild_wheel #14 1788.3 wheel_directory, config_settings) #14 1788.3 File "/usr/local/lib/python3.6/dist-packages/setuptools/build_meta.py", line 215, in _ build_with_temp_dir #14 1788.3 self.run_setup() #14 1788.3 File "/usr/local/lib/python3.6/dist-packages/setuptools/build_meta.py", line 268, in r un_setup #14 1788.3 self).run_setup(setup_script=setup_script) #14 1788.3 File "/usr/local/lib/python3.6/dist-packages/setuptools/build_meta.py", line 158, in r un_setup #14 1788.3 exec(compile(code, __file__, 'exec'), locals()) #14 1788.3 File "setup.py", line 537, in <module> #14 1788.3 main() #14 1788.3 File "setup.py", line 310, in main #14 1788.3 cmake_source_dir=cmake_source_dir, #14 1788.3 File "/tmp/pip-build-env-9wbzljs3/overlay/lib/python3.6/site-packages/skbuild/setuptoo ls_wrap.py", line 683, in setup #14 1788.3 cmake_install_dir, #14 1788.3 File "setup.py", line 450, in _classify_installed_files_override #14 1788.3 raise Exception("Not found: '%s'" % relpath_re) #14 1788.3 Exception: Not found: 'python/cv2/python-3/cv2.*' #14 1788.3 Building wheel for opencv-python (pyproject.toml): finished with status 'error' #14 1788.3 ERROR: Failed building wheel for opencv-python #14 1788.3 Created temporary directory: /tmp/pip-wheel-zsi8p8ua #14 1788.3 Building wheel for future (setup.py): started #14 1788.3 Destination directory: /tmp/pip-wheel-zsi8p8ua
解决方案
核心原因
- 基础镜像
tensorflow/tensorflow:1.14.0-gpu-py3基于Ubuntu 16.04,强行替换为Ubuntu 20.04的CUDA源会导致依赖环境混乱 - 系统已安装
python3-opencv,但pip install仍尝试编译最新版OpenCV,版本冲突导致编译路径不匹配
修改后的Dockerfile
FROM tensorflow/tensorflow:1.14.0-gpu-py3 ENV TZ="America/Los_Angeles" ARG DEBIAN_FRONTEND=noninteractive # 保留原镜像的CUDA配置,避免环境冲突 RUN apt-get update && apt-get install -y --no-install-recommends git python3-opencv # 设置构建目录并复制代码 RUN mkdir /build COPY baselines/ /build/baselines WORKDIR /build/baselines # 升级工具后,跳过OpenCV编译,直接使用系统版本 RUN pip3 install --upgrade pip setuptools wheel RUN pip3 install -e . -vvv --ignore-installed opencv-python
关键修改点
- 移除CUDA源替换步骤:原镜像的CUDA配置适配Ubuntu 16.04,替换后会引发依赖冲突
- 添加
--ignore-installed opencv-python:告诉pip不重新编译OpenCV,直接使用系统已安装的版本 - 若需通过pip安装OpenCV,可在安装前指定兼容Python 3.6的旧版本:
RUN pip3 install opencv-python==4.5.5.62
内容的提问来源于stack exchange,提问作者Yv Zuo
相关产品推荐
相关产品推荐

