使用Alpine Linux Docker构建AWS Lambda zip包时Shapely报geos_c缺失错误
问题根因
Shapely是GEOS库的Python封装,运行时依赖系统层面的GEOS动态库libgeos_c.so。你当前的构建流程仅拷贝了Python虚拟环境内的第三方包代码,未将Alpine镜像中安装的GEOS动态库一同打包进lambda.zip,因此运行时会抛出找不到依赖库的错误。
解决方案
步骤1:修正并精简Dockerfile
首先清理Dockerfile冗余配置,补全语法错误,确保GEOS依赖正确安装:
FROM alpine:3.12 # 安装基础OS依赖 RUN apk add --update --no-cache \ bash \ build-base \ curl \ gcc \ g++ \ libc-dev \ libffi-dev \ openssl-dev \ python3-dev \ python3 \ rsync \ zip \ # 安装GEOS依赖 geos \ geos-dev # 配置Python环境 RUN python3 -m ensurepip --upgrade \ && pip3 install --upgrade pip pipenv wheel \ && ln -sf pip3 /usr/bin/pip \ && ln -sf python3 /usr/bin/python WORKDIR /build
步骤2:修改构建脚本,打包GEOS动态库
AWS Lambda会自动加载部署包根目录下的动态库,因此需要将Alpine系统中的libgeos_c相关文件拷贝到打包目录:
#!/bin/bash set -x set -e pipenv install rm -rf lambda.zip VENV=$(pipenv --venv) TEMPDIR=$(mktemp -d) # 拷贝业务代码 rsync -r --progress ./* ${TEMPDIR} --exclude lambda.zip # 拷贝Python依赖包 rsync -r --progress ${VENV}/lib/python*/site-packages/* ${TEMPDIR} # 新增:拷贝GEOS动态库到打包目录根路径 rsync /usr/lib/libgeos_c.so* ${TEMPDIR}/ pushd ${TEMPDIR} zip -r lambda.zip ./* popd cp ${TEMPDIR}/lambda.zip ./ cleanup() { rm -rf ${TEMPDIR} } trap cleanup EXIT
兼容说明
如果你使用的是AWS标准Lambda运行环境(基于Amazon Linux 2/2023,使用glibc标准库),Alpine使用的musl标准库编译的动态库可能存在兼容问题。此时建议直接使用AWS官方的Python构建镜像替换Alpine基础镜像,镜像名称格式为public.ecr.aws/sam/build-python<你的Python版本号>,构建流程无需其他修改,即可保证依赖和Lambda运行环境100%兼容。
内容的提问来源于stack exchange,提问作者Stark
相关产品推荐
相关产品推荐

