Docker容器运行Python应用无法导入cv2、缺少libGL.so.1如何解决?
问题原因
你遇到的报错是两个问题叠加导致的:
- 你在requirements.txt里同时安装了
opencv-python和opencv-python-headless两个包,二者功能重叠:前者是带GUI功能的OpenCV版本,依赖系统的libGL图形库;后者是无GUI的服务端版本,不需要libGL依赖。两个包同时存在时会优先调用前者的动态链接库,触发依赖缺失报错。 - 官方
python:3.7基础镜像为了减小体积,默认没有预装libGL这类图形相关的系统依赖包。
解决方案
你可以根据自己的业务场景二选一:
方案1(推荐,镜像体积更小)
直接修改requirements.txt,删除opencv-python这一行,仅保留opencv-python-headless即可,无需修改Dockerfile其他配置。headless版本专门针对服务器/容器无GUI的运行环境设计,不会触发libGL依赖报错。
方案2(如果必须使用带GUI的opencv-python版本)
修改Dockerfile,在安装Python依赖之前先安装系统层面的依赖包,修改后的Dockerfile参考如下:
FROM python:3.7 WORKDIR /app # 安装系统依赖 RUN apt-get update && apt-get install -y --no-install-recommends \ libgl1-mesa-glx \ libglib2.0-0 \ && rm -rf /var/lib/apt/lists/* # Install python dependencies ADD requirements.txt /app/ RUN pip3 install --upgrade pip RUN pip3 install -r requirements.txt # Copy sources ADD . /app # Run detection CMD ["detect.py" ] ENTRYPOINT ["python3"]
这里加入--no-install-recommends和清理apt缓存的步骤是为了避免冗余文件增大镜像体积。
补充说明
你之前尝试安装python3-opencv报错是因为这个包是Debian官方源提供的安装包,安装前需要先执行apt-get update更新源索引,且该包提供的OpenCV版本普遍落后于pip源的opencv-python版本,非必要不推荐使用。
内容的提问来源于stack exchange,提问作者Manitoba
相关产品推荐
相关产品推荐

