python(44) : docker构建支持消费rocketmq的客户端

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 镜像中:

  1. 安装系统依赖
  2. 下载并编译安装 librocketmq 动态库
  3. 确保 Python 包能正确找到它

3.解决方法

3.1.下载RocketMQ C++ 客户端的预编译二进制版本(bin-release)

RocketMQ C++ 客户端的预编译二进制版本(bin-release) ,已经包含了编译好的动态库(如 librocketmq.so),你只需要把它解压并放到系统能识别的路径中即可,无需再安装 cmakebuild-essential 等编译工具

Releases · apache/rocketmq-client-cpp

下载rocketmq-client-cpp-2.2.0-bin-release.tar.gz即可

3.2.创建文件

build.sh

复制代码
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

相关推荐
zzzll11111 小时前
Loop Engineering:循环工程的原理、实践与应用
java·数据库·python
刘新洲1 小时前
别再只做会聊天的 Agent:我用 1 天把工具调用做成了可验证、可评测的工程系统
人工智能·python·openai
码云骑士1 小时前
102-向量数据增删改查-增量更新-过期策略-向量漂移重索引
python
Molecular_Chat1 小时前
Biotin SNA 生物素偶联凝集素结合特异性、生物素标记效率定量表征研究
javascript·python
WILLF1 小时前
Python vs JavaScript 异常处理对比
前端·python
宋辰轩2 小时前
Docker导致的wsl2崩溃问题
docker·wsl2
码农阿豪2 小时前
Ubuntu部署GodoOS:Docker搭建Web办公桌面并实现远程访问
前端·ubuntu·docker
问天_观心2 小时前
python之uv库的学习
开发语言·python
vx-程序开发2 小时前
django汽车租赁系统---附源码25360
java·javascript·spring boot·python·eclipse·django·php