ImportError: libGL.so.1: cannot open shared object file の対処

結論を先に。このエラーは、OpenCV(cv2)が必要とするシステム共有ライブラリ libGL.so.1 が、サーバやコンテナに入っていないために起きます。libgl1 を入れるか、GUI不要ならヘッドレス版の opencv-python-headless を使えば解決します。

ImportError: libGL.so.1: cannot open shared object file: No such file or directory

原因

opencv-python はOpenGL関連の共有ライブラリに依存します。デスクトップ環境なら入っていますが、Dockerの軽量イメージやサーバではこのライブラリが無く、import 時に読み込めず失敗します。

対処

  1. システムにライブラリを入れます(Debian/Ubuntu系)。
Terminal window
apt-get update && apt-get install -y libgl1

環境によっては libglib2.0-0 も必要です。

  1. サーバやCIなど画面表示が不要な用途なら、ヘッドレス版に置き換えるのが確実です。
Terminal window
pip uninstall -y opencv-python
pip install opencv-python-headless
  1. Dockerで使うなら、Dockerfileにライブラリ導入を書いておきます。
RUN apt-get update && apt-get install -y libgl1 && rm -rf /var/lib/apt/lists/*

まとめ

  • 原因は cv2 が使う libGL.so.1 がシステムに無いこと
  • apt で libgl1(必要なら libglib2.0-0)を入れる
  • 画面不要なら opencv-python-headless に置き換える
  • Docker はDockerfileでRUN apt-get install しておく