Docker部署Django项目时GDAL库文件缺失问题求助
问题:Docker容器中Django无法找到GDAL库文件
环境信息
- 宿主机:Ubuntu 22.04 LTS
- Django版本:3.2
- Python版本:3.8.14(Docker镜像)
- GDAL版本:3.4.1
报错现象
执行docker-compose启动容器时,抛出以下错误:
OSError: /usr/lib/libgdal.so: cannot open shared object file: No such file or directory
相关配置与检查结果
- Django
settings.py中的GDAL配置:
GDAL_LIBRARY_PATH = "/usr/lib/libgdal.so"
- 本地GDAL版本与Python绑定安装:
gdal-config --version 3.4.1
已执行pip3 install gdal==3.4.1安装对应版本的Python绑定。
- 宿主机GDAL库文件状态:
ls -l /usr/lib/libgdal.so # 输出: lrwxrwxrwx 1 root root 17 Mar 16 2022 /usr/lib/libgdal.so -> libgdal.so.30.0.1
完整报错堆栈
my-api-webserver | Traceback (most recent call last): my-api-webserver | File "manage.py", line 25, in <module> my-api-webserver | execute_from_command_line(sys.argv) my-api-webserver | File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line my-api-webserver | utility.execute() my-api-webserver | File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute my-api-webserver | django.setup() my-api-webserver | File "/usr/local/lib/python3.8/site-packages/django/__init__.py", line 24, in setup my-api-webserver | apps.populate(settings.INSTALLED_APPS) my-api-webserver | File "/usr/local/lib/python3.8/site-packages/django/apps/registry.py", line 114, in populate my-api-webserver | app_config.import_models() my-api-webserver | File "/usr/local/lib/python3.8/site-packages/django/apps/config.py", line 301, in import_models my-api-webserver | self.models_module = import_module(models_module_name) my-api-webserver | File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module my-api-webserver | return _bootstrap._gcd_import(name[level:], package, level) my-api-webserver | File "<frozen importlib._bootstrap>", line 1014, in _gcd_import my-api-webserver | File "<frozen importlib._bootstrap>", line 991, in _find_and_load my-api-webserver | File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked my-api-webserver | File "<frozen importlib._bootstrap>", line 671, in _load_unlocked my-api-webserver | File "<frozen importlib._bootstrap_external>", line 843, in exec_module my-api-webserver | File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed my-api-webserver | File "/opt/my-api/kosmosnetwork_socialcommerce/src/commerce/apps/stores/models.py", line 3, in <module> my-api-webserver | from . import abstract_models my-api-webserver | File "/opt/my-api/kosmosnetwork_socialcommerce/src/commerce/apps/stores/abstract_models.py", line 1, in <module> my-api-webserver | from django.contrib.gis.db.models import Manager, PointField my-api-webserver | File "/usr/local/lib/python3.8/site-packages/django/contrib/gis/db/models/__init__.py", line 3, in <module> my-api-webserver | import django.contrib.gis.db.models.functions # NOQA my-api-webserver | File "/usr/local/lib/python3.8/site-packages/django/contrib/gis/db/models/functions.py", line 3, in <module> my-api-webserver | from django.contrib.gis.db.models.fields import BaseSpatialField, GeometryField my-api-webserver | File "/usr/local/lib/python3.8/site-packages/django/contrib/gis/db/models/fields.py", line 3, in <module> my-api-webserver | from django.contrib.gis import forms, gdal my-api-webserver | File "/usr/local/lib/python3.8/site-packages/django/contrib/gis/forms/__init__.py", line 3, in <module> my-api-webserver | from .fields import ( # NOQA my-api-webserver | File "/usr/local/lib/python3.8/site-packages/django/contrib/gis/forms/fields.py", line 2, in <module> my-api-webserver | from django.contrib.gis.gdal import GDALException my-api-webserver | File "/usr/local/lib/python3.8/site-packages/django/contrib/gis/gdal/__init__.py", line 28, in <module> my-api-webserver | from django.contrib.gis.gdal.datasource import DataSource my-api-webserver | File "/usr/local/lib/python3.8/site-packages/django/contrib/gis/gdal/datasource.py", line 40, in <module> my-api-webserver | from django.contrib.gis.gdal.driver import Driver my-api-webserver | File "/usr/local/lib/python3.8/site-packages/django/contrib/gis/gdal/driver.py", line 5, in <module> my-api-webserver | from django.contrib.gis.gdal.prototypes import ds as vcapi, raster as rcapi my-api-webserver | File "/usr/local/lib/python3.8/site-packages/django/contrib/gis/gdal/prototypes/ds.py", line 9, in <module> my-api-webserver | from django.contrib.gis.gdal.libgdal import GDAL_VERSION, lgdal my-api-webserver | File "/usr/local/lib/python3.8/site-packages/django/contrib/gis/gdal/libgdal.py", line 50, in <module> my-api-webserver | lgdal = CDLL(lib_path) my-api-webserver | File "/usr/local/lib/python3.8/ctypes/__init__.py", line 373, in __init__ my-api-webserver | self._handle = _dlopen(self._name, mode) my-api-webserver | OSError: /usr/lib/libgdal.so: cannot open shared object file: No such file or directory my-api-webserver exited with code 1
当前使用的Dockerfile
FROM python:3.8.14 RUN apt-get -y update && apt-get -y upgrade && apt-get install -y ffmpeg COPY wait-for-it.sh /wait-for-it.sh RUN export CPLUS_INCLUDE_PATH=/usr/include/gdal RUN export C_INCLUDE_PATH=/usr/include/gdal # Copy any files over COPY entrypoint.sh /entrypoint.sh # Copy any files over COPY bootstrap_development_data.sh /bootstrap_development_data.sh # Change permissions RUN chmod +x /entrypoint.sh RUN chmod +x /bootstrap_development_data.sh RUN chmod +x /wait-for-it.sh RUN groupadd -r docker && useradd -r -g docker earthling RUN chown -R earthling /root/ ENTRYPOINT ["/entrypoint.sh"] COPY requirements.txt /requirements.txt RUN pip3 install --upgrade pip setuptools wheel RUN pip3 install -r /requirements.txt RUN yes | pip uninstall django-rq-scheduler RUN yes | pip install -U django-rq-scheduler VOLUME ["/opt/my-api"] EXPOSE 80 CMD ["python", "manage.py", "runserver", "0.0.0.0:80"]
背景说明
此前使用Ubuntu 18.04(GDAL版本2.4.2),为升级GDAL版本切换到22.04,已在宿主机执行sudo apt-get install libgdal-dev安装3.4.1版本,但容器启动时仍报错,多次尝试未解决,寻求帮助。
内容的提问来源于stack exchange,提问作者Ananth
相关产品推荐
相关产品推荐

