GIS開発研究所 > GeoDjangoのGDAL・GEOSエラー原因|本番デプロイの確認手順
2026年7月21日
•約8分で読めます
GeoDjangoを本番へデプロイした際のGDAL・GEOSライブラリエラーを切り分けます。OSパッケージ、共有ライブラリ、バージョン、環境変数、Dockerの実行ステージ、PostGIS拡張を確認し、ローカルだけ動く問題を防ぐ手順を紹介します。
ローカル環境では動いていたGeoDjangoを本番サーバーやコンテナへデプロイすると、Could not find the GDAL libraryやGEOSの読み込みエラーが発生することがあります。
GeoDjangoはPythonパッケージだけでは動きません。GDAL、GEOS、PROJなどのネイティブライブラリがOS側に必要です。Pythonの依存関係をインストールしても、実行環境に共有ライブラリがなければ起動時に失敗します。
次の順番で切り分けます。
エラーメッセージに表示された候補バージョンを見て、Python設定へパスを適当に追加するだけでは再発します。実際にインストールされたファイルと、アプリを動かしている環境を確認します。
django.core.exceptions.ImproperlyConfigured:
Could not find the GDAL library
GDAL自体がない、共有ライブラリだけがない、または動的リンカーの検索パスに含まれていない場合に発生します。
OSError: libgeos_c.so: cannot open shared object file
GEOSのC API共有ライブラリがない、あるいは実行環境から参照できない状態です。
開発PCにはHomebrewやOSパッケージでGDALが入っている一方、本番イメージにはPython依存だけを入れている場合によく起きます。
マルチステージビルドでは、ビルドステージにだけライブラリを入れ、実行ステージへ必要な共有ライブラリを含め忘れることがあります。
確認コマンドは、ホストOSではなく、実際にDjangoを動かしているコンテナやサーバー内で実行します。
gdalinfo --version
geos-config --version
projinfo --version
コマンドが見つからない場合は、対応するOSパッケージが不足しています。コマンドが動いても、Pythonプロセスが共有ライブラリを読めるとは限らないため、次にGeoDjangoから確認します。
python -c "from django.contrib.gis.gdal import GDAL_VERSION; print(GDAL_VERSION)"
GEOSも読み込めるか確認します。
python -c "from django.contrib.gis.geos import geos_version; print(geos_version())"
ここで同じエラーが出れば、アプリ固有の処理ではなく、GeoDjangoの起動前提に問題があります。
Debian系のコンテナでは、構成に応じて次のようなパッケージが必要です。
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
gdal-bin \
libgdal-dev \
libgeos-dev \
proj-bin \
&& rm -rf /var/lib/apt/lists/*
パッケージ名はOSとバージョンによって異なります。Alpine Linux、Amazon Linux、Red Hat系では別の名前になります。利用中のベースイメージのパッケージ一覧を確認してください。
ビルドにヘッダーファイルが必要でも、実行時にはランタイムライブラリだけでよい場合があります。ただし、最適化のためにパッケージを削るのは、動作確認後に進めます。
Linuxでは、次のようなコマンドで動的リンカーが認識しているライブラリを確認できます。
ldconfig -p | grep -E "gdal|geos"
環境によってldconfigがない場合は、パッケージ管理システムやfindで実ファイルを確認します。
find /usr -name "libgdal.so*" -o -name "libgeos_c.so*"
ファイルが存在しても、プロセスのアーキテクチャと一致しない場合や、依存する別ライブラリが不足している場合は読み込めません。
ldd /usr/lib/x86_64-linux-gnu/libgdal.so
not foundが表示された依存ライブラリがあれば、そのパッケージを追加します。実際のパスは環境ごとに異なるため、確認したファイルを指定します。
GeoDjangoが自動検出できない場合は、Django設定へライブラリの絶対パスを指定できます。
GDAL_LIBRARY_PATH = "/usr/lib/x86_64-linux-gnu/libgdal.so"
GEOS_LIBRARY_PATH = "/usr/lib/x86_64-linux-gnu/libgeos_c.so"
この設定は最後の手段です。存在しないパスや、開発PCだけのパスを固定すると、環境更新のたびに壊れます。
指定する前に次を確認します。
コンテナでは、OSパッケージを正しく入れ、自動検出できる状態にするほうが保守しやすい場合が多くあります。
ネイティブライブラリは互いに依存しています。異なる配布元から部分的にインストールすると、バージョンの組み合わせで問題が起きることがあります。
gdalinfo --version
geos-config --version
projinfo --version
python -c "import django; print(django.get_version())"
利用バージョンをデプロイログへ残しておくと、ベースイメージ更新後に発生した問題を比較できます。
latestタグだけに依存せず、動作確認したOSイメージと主要パッケージのバージョンを固定します。セキュリティ更新時は、ステージング環境でGIS処理を確認してから本番へ反映します。
GeoDjangoが起動しても、PostGIS拡張が有効でなければ空間フィールドや関数を使えません。
SELECT PostGIS_Full_Version();
拡張が未作成の場合は、権限を持つユーザーが対象データベースで作成します。
CREATE EXTENSION IF NOT EXISTS postgis;
本番環境では、アプリ用ユーザーへ拡張作成権限を付けない構成が一般的です。データベース管理者やマイグレーション用の権限で事前に作成します。
FROM python:3.12-slim AS builder
# ここにGDALを入れても
FROM python:3.12-slim AS runtime
# runtimeへ必要な共有ライブラリがなければ動かない
最終イメージへ必要なランタイムライブラリを入れます。ビルド成功だけでなく、最終イメージからGeoDjangoをimportするテストを行います。
Apple Silicon上で作ったイメージと本番のアーキテクチャが異なる場合、ネイティブライブラリの問題が表面化することがあります。CIで本番と同じプラットフォーム向けにビルドします。
コンテナのヘルスチェックやCIで、次の確認を行います。
python -c "from django.contrib.gis.gdal import GDAL_VERSION; print(GDAL_VERSION)"
python -c "from django.contrib.gis.geos import geos_version; print(geos_version())"
python manage.py check
アプリへトラフィックが到達する前に、GISライブラリの不足を検出できます。
not foundがない起動確認だけでなく、ST_Intersectsを使う検索、座標変換、GeoJSON出力など、実際に利用する処理まで確認します。
BitLightでは、GeoDjango、PostGIS、GDALを使ったGISシステムの環境構築、デプロイエラーの調査、データ処理まで支援しています。
ローカルでは動くものの本番だけ起動しない、コンテナを軽量化するとGIS処理が壊れるといった問題も、実行環境と依存関係を確認して切り分けます。GIS開発を無料相談する
千葉県出身。10歳の頃からプログラミングを始め、ゲーム、Webサイト、ロボット、スマホアプリなどを制作。大阪大学基礎工学部情報科学科で情報工学と統計学を学び、大学時代はAIを研究。大学在学中にWeb広告代理店でのインターンや人材系Webサービスの立ち上げを経験し、卒業後はフリーランスエンジニアとしてGISシステム、データ基盤構築、Webシステムの開発に従事。10年以上のWebアプリ開発・データ分析経験を基に、2023年9月に株式会社ビットライトを設立し、現場業務の仕組み化からデータ基盤構築、データ活用支援までを一気通貫で支援。