Docker 环境下 GeoPandas/Fiona 报错
最近在部署 FastAPI 后端的时候,踩了小坑。
系统是用 Docker 跑的,基础镜像选的是 python:3.11-slim
,想着 slim 版干净轻量、打包也快。
结果上线之后,用户一上传 SHP 文件就直接报错,一串长长的 Traceback,把我整懵了。
错误核心信息是这样的:
ImportError: the 'read_file' function requires the 'fiona' package, but it is not installed or does not import correctly. Importing fiona resulted in: libexpat.so.1: cannot open shared object file: No such file or directory
当时我还以为是 fiona
没装好,于是各种 pip install --force-reinstall fiona
,结果根本没用。
容器重启、重新构建,照样报一样的错。
后来冷静下来仔细看报错信息,关键在最后一句:
“libexpat.so.1: cannot open shared object file: No such file or directory”
原来这不是 Python 层的问题,而是系统层的动态库缺失。
fiona
这个库在底层其实是用 C 写的,依赖一些系统级的 GIS 库如 GDAL、Expat 之类的。
libexpat.so.1
就是个 XML 解析的动态库文件,而 python:slim
版本默认是极度精简的,很多基础库都没带上。
也就是说——
不是 fiona 没装,而是它装上了,却“用不起来”。
明白原因后,解决就特别简单了。
只要在 Dockerfile 里加上安装系统依赖的命令,装上缺的库就行:
RUN apt-get update && \ apt-get install -y --no-install-recommends libexpat1 gdal-bin libgdal-dev && \ rm -rf /var/lib/apt/lists/*
libexpat1
就是报错缺的库,
gdal-bin
和 libgdal-dev
是 Fiona、GeoPandas 读写 SHP 文件的底层支持。
然后重新 build 一下镜像,启动服务,再传 SHP 文件,完美解决。
日志干干净净,地图数据直接解析出来,舒服!
这事让我彻底长了记性:
以后再用 python:slim
或类似的轻量镜像,一定要记得——
Python 装完包不代表能用,有些包还要系统级的 C 库配合。
尤其是像 GeoPandas、Fiona、Shapely 这种跟 GIS、空间分析沾边的库,底层全是 C 语言和 GDAL,那些库如果没装上,pip 装一万次都没用。