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

相关推荐
程序员爱钓鱼24 分钟前
Python 编程实战 · 实用工具与库 — Flask 路由与模板
前端·后端·python
程序员爱钓鱼27 分钟前
Python 编程实战 · 实用工具与库 — Django 项目结构简介
后端·python·面试
新之助小锅1 小时前
java版连接汇川PLC,发送数据,读取数据,保持重新链接,适用安卓
android·java·python
海琴烟Sunshine1 小时前
leetcode 383. 赎金信 python
python·算法·leetcode
惊讶的猫7 小时前
LSTM论文解读
开发语言·python
测试老哥8 小时前
软件测试之单元测试知识总结
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
buvsvdp50059ac8 小时前
如何在VSCode中设置Python解释器?
ide·vscode·python
njxiejing9 小时前
Python进度条工具tqdm的安装与使用
开发语言·python
计算机小手9 小时前
快速搭建一个 GitHub 开源项目导航网站,提供便捷的信息抓取、智能摘要、分类管理功能
经验分享·docker·github·开源软件