python-ldap 3.4在Alpine Docker镜像中安装失败报错无法找到-lldap_r
问题根因
Alpine Linux 官方源提供的openldap 2.5及以上版本,已经移除了独立的线程安全库libldap_r.so,当前默认的libldap.so本身已经支持线程安全。但python-ldap 3.4版本的默认构建脚本仍会强制链接libldap_r,因此会出现链接器找不到库的报错。
可行解决方案
两种方案二选一即可,都可以正常完成安装:
方案1:创建临时软链接
安装完openldap-dev后,手动给libldap.so创建名为libldap_r.so的软链接,欺骗构建脚本找到依赖,安装完成后清理构建依赖时不会影响运行时使用:
ln -s /usr/lib/libldap.so /usr/lib/libldap_r.so
方案2:安装时指定编译参数
pip安装python-ldap时,通过环境变量指定链接参数,直接用libldap替代libldap_r,无需修改系统文件:
LDFLAGS="-lldap" pip install python-ldap==3.4
完整Dockerfile示例
FROM python:3.9-alpine # 安装运行时依赖(保留运行python-ldap所需的基础库) RUN apk add --no-cache openldap cyrus-sasl # 安装构建依赖并完成python-ldap安装 RUN apk add --no-cache --virtual .build-deps \ musl-dev \ gcc \ postgresql-dev \ openldap-dev \ libffi-dev \ cyrus-sasl-dev \ # 选用方案1则保留下一行,选用方案2则注释下一行 && ln -s /usr/lib/libldap.so /usr/lib/libldap_r.so \ # 选用方案1用下面这句pip命令 && pip install --no-cache-dir python-ldap==3.4 \ # 选用方案2则注释上面两句,用下面这句pip命令 # && LDFLAGS="-lldap" pip install --no-cache-dir python-ldap==3.4 \ # 清理构建依赖,减小镜像体积 && apk del .build-deps
验证方法
构建完成后执行以下命令,输出版本号即代表安装成功:
docker run --rm 你的镜像名 python -c "import ldap; print(ldap.__version__)"
内容的提问来源于stack exchange,提问作者krnnrt
相关产品推荐
相关产品推荐

