在Amazon Linux 2安装Spatialite遇libgdal.so: undefined symbol: sqlite3_trace_v2错误
问题:AWS Lambda Docker镜像中GeoDjango依赖Spatialite的GDAL符号错误
背景
我正在为运行Python的AWS Lambda构建包含Spatialite(用于GeoDjango)的Docker镜像。折腾GDAL安装遇到一堆问题后,发现ghcr.io/lambgeo/lambda-gdal:3.8-python3.11镜像解决了大部分问题,但还需要安装Spatialite。
当前Dockerfile配置
FROM ghcr.io/lambgeo/lambda-gdal:3.8-python3.11 as gdal RUN yum update -y && \ yum install -y git autoconf libtool flex bison cmake make \ tar gzip xz gcc gcc-c++ automake16 libpng-devel nasm \ readline-devel openssl-devel curl-devel \ cmake3 && \ yum clean all && \ rm -rf /var/cache/yum /var/lib/yum/history ENV PREFIX /opt WORKDIR /opt ENV LD_LIBRARY_PATH $PREFIX/lib:$LD_LIBRARY_PATH RUN patchelf --force-rpath --set-rpath '$ORIGIN' $PREFIX/lib/libgdal.so # pkg-config ENV PKGCONFIG_VERSION=0.29.2 RUN mkdir /tmp/pkg-config \ && curl -sfL https://pkg-config.freedesktop.org/releases/pkg-config-${PKGCONFIG_VERSION}.tar.gz | tar zxf - -C /tmp/pkg-config --strip-components=1 \ && cd /tmp/pkg-config \ && CFLAGS="-O2 -Wl,-S" ./configure --prefix=$PREFIX --with-internal-glib \ && make -j $(nproc) --silent && make install && make clean \ && rm -rf /tmp/pkg-config ENV PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/ # libxml2 RUN mkdir /tmp/libxml2 \ && curl -sfL https://download.gnome.org/sources/libxml2/2.12/libxml2-2.12.3.tar.xz | tar xJf - -C /tmp/libxml2 --strip-components=1 \ && cd /tmp/libxml2 \ && \ CFLAGS='-O2 -fno-semantic-interposition' \ PYTHON_CFLAGS='-I/var/lang/include/python3.11' \ PKG_CONFIG_PATH='/var/lang/lib/pkgconfig/' \ LDFLAGS='-Wl,-rpath=/var/lang/lib -L/var/lang/lib -lpython3.11' \ ./configure --prefix=${PREFIX} \ && make -j $(nproc) --silent && make install && make clean \ && rm -rf /tmp/libxml2 # spatialite RUN mkdir /tmp/spatialite \ && curl -sfL https://www.gaia-gis.it/gaia-sins/libspatialite-sources/libspatialite-5.1.0.tar.gz | tar zxf - -C /tmp/spatialite --strip-components=1 \ && cd /tmp/spatialite \ && CFLAGS='-I/opt/include' LDFLAGS='-L/opt/lib' \ ./configure --prefix=${PREFIX} \ --enable-freexl=no --enable-minizip=no --disable-rttopo \ && make -j $(nproc) --silent && make install && make clean \ && rm -rf /tmp/spatialite
问题详情
因为基础镜像导出的层没有pkgconfig这类组件,我只能重复安装,还得从源码装libxml2来解决之前的一个错误。Spatialite看起来安装成功了,但运行Django应用时出现以下错误:
File "/project/.venv/lib/python3.11/site-packages/django/contrib/gis/gdal/libgdal.py", line 71, in <module> lgdal = CDLL(lib_path) ^^^^^^^^^^^^^^ File "/var/lang/lib/python3.11/ctypes/__init__.py", line 376, in __init__ self._handle = _dlopen(self._name, mode) ^^^^^^^^^^^^^^^^^^^^^^^^^ OSError: /opt/lib/libgdal.so: undefined symbol: sqlite3_trace_v2
Django配置与环境变量
我的Django settings.py配置:
GDAL_LIBRARY_PATH = env("GDAL_LIBRARY_PATH", default="") GEOS_LIBRARY_PATH = env("GEOS_LIBRARY_PATH", default="") SPATIALITE_LIBRARY_PATH = env("SPATIALITE_LIBRARY_PATH", default="")
设置的环境变量:
ENV GDAL_LIBRARY_PATH=/opt/lib/libgdal.so ENV GEOS_LIBRARY_PATH=/opt/lib/libgeos.so ENV SPATIALITE_LIBRARY_PATH=/opt/lib/mod_spatialite.so
谷歌搜了一圈没找到解决方案,只发现一个Python问题(已在Python 3.10修复),但我用的是Python 3.11。
内容的提问来源于stack exchange,提问作者Anentropic
相关产品推荐
相关产品推荐

