1.需求
基于python:3.10-slim镜像部署python服务, 其中会消费rocketmq, 消费报错 ,如下
File "/app/main.py", line 6, in <module>
from consumer.rocketmq_consumer import consumer
File "/app/consumer/rocketmq_consumer.py", line 12, in <module>
from rocketmq.client import ConsumeStatus
File "/usr/local/lib/python3.10/site-packages/rocketmq/client.py", line 24, in <module>
from .ffi import (
File "/usr/local/lib/python3.10/site-packages/rocketmq/ffi.py", line 40, in <module>
raise ImportError('rocketmq dynamic library not found')
ImportError: rocketmq dynamic library not found
2.原因
是因为 Python 的 rocketmq-client-python
包依赖一个 C/C++ 编写的动态链接库(librocketmq.so) ,但在你的容器环境(基于 python:3.10-slim
)中 没有安装这个底层库,导致无法加载。
2.1.错误原因分析
python:3.10-slim
是一个极简镜像,缺少编译和运行原生扩展所需的工具链和库。rocketmq.client
使用了cffi
调用 RocketMQ 的 C++ 客户端(通过 JNI 或 librocketmq)。- 但
librocketmq.so
没有被自动安装或找不到路径。
2.2.解决方案
你需要在 Docker 镜像中:
- 安装系统依赖
- 下载并编译安装
librocketmq
动态库 - 确保 Python 包能正确找到它
3.解决方法
3.1.下载RocketMQ C++ 客户端的预编译二进制版本(bin-release)
RocketMQ C++ 客户端的预编译二进制版本(bin-release) ,已经包含了编译好的动态库(如 librocketmq.so
),你只需要把它解压并放到系统能识别的路径中即可,无需再安装 cmake
、build-essential
等编译工具。
Releases · apache/rocketmq-client-cpp
下载[rocketmq-client-cpp-2.2.0-bin-release.tar.gz]即可
3.2.创建文件
cp requirements.txt .
# 删除名为 py_rocketmq:0.1 的本地 Docker 镜像(如果存在)
docker rmi py_rocketmq:0.1
# 解压并整理 rocketmq-client-cpp 库文件(必须linux解压, win解压有问题)
tar -zxvf rocketmq-client-cpp-2.0.0-bin-release.tar.gz
tar -zxvf rocketmq-client-cpp-2.0.0-bin-release/centos7/rocketmq-client-cpp-2.0.0-bin-release.tar.gz
mkdir -p package
mv rocketmq-client-cpp/include package
mv rocketmq-client-cpp/lib package
rm -rf rocketmq-client-cpp
rm -rf rocketmq-client-cpp-2.0.0-bin-release
# 使用当前目录下的 Dockerfile 构建新的 py_rocketmq:0.1 镜像
docker build -t py_rocketmq:0.1 . --no-cache
rm -rf package
Dockerfile
# 使用Python 3.11官方镜像作为基础镜像
FROM python:3.10-slim
WORKDIR /app
COPY package .
COPY requirements.txt .
RUN cp -r /app/lib/* /usr/local/lib/ \
&& cp -r /app/include/* /usr/local/include/ \
&& ldconfig
# 设置库路径
ENV LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
# 升级pip
RUN python -m pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/ requests
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ requests
3.3.构建镜像
bash
sh build.sh
4.基于构建的镜像部署python服务
参考 : https://blog.csdn.net/Lxinccode/article/details/152129645