使用 pulsar-build Docker 镜像可复现构建 Apache Pulsar C++ 客户端与网站

发布时间:2026/9/23 5:12:34

使用 pulsar-build Docker 镜像可复现构建 Apache Pulsar C++ 客户端与网站 使用 pulsar-build Docker 镜像可复现构建 Apache Pulsar C 客户端与网站【免费下载链接】pulsarApache Pulsar - distributed pub-sub messaging system项目地址: https://gitcode.com/gh_mirrors/pulsar28/pulsar本篇技术指南以 build/docker/README.md 为核心系统讲解 Apache Pulsar 仓库中build/docker目录下pulsar-build构建镜像的用途、构建与发布流程并结合仓库内的 Dockerfile、publish.sh 以及pulsar-client-cpp/docker/下的实际调用脚本深入剖析镜像的软件栈组成与在 C 客户端、Python wheel、单元测试、代码格式化等场景中的真实用法。读完本文你将掌握如何使用该镜像在统一、可复现的环境中编译 Pulsar C 客户端库、构建官网并发布镜像。镜像的用途为 Pulsar 构建提供可复现环境build/docker目录下存放了一个用于构建 Apache Pulsar C 客户端库libpulsar以及官网website的 Docker 镜像——pulsar-build。其核心价值在于将构建所需的一切工具链与依赖固化到镜像中从而在任何机器上都能得到一致、可复现的编译结果避免因本地环境差异如系统库版本、编译器版本、工具链缺失导致的在我机器上能编译问题。该镜像已经在 Docker Hub 的apachepulsar组织下发布命名规则为apachepulsar/pulsar-build:tag例如apachepulsar/pulsar-build:ubuntu-16.04这也是build/docker目录下 Dockerfile 构建出的默认标签。在仓库的实际工程流程中pulsar-build镜像承担了多种构建职责主要包括使用场景入口脚本用途构建 C 客户端库pulsar-client-cpp/docker/build-client-lib.sh在manylinux镜像内编译libpulsar构建 Python wheelpulsar-client-cpp/docker/build-wheels.sh为多个 Python 版本打包发布 wheel运行单元测试pulsar-client-cpp/docker-tests.sh在镜像内执行 C 单元测试代码格式化pulsar-client-cpp/docker-format.sh使用镜像内的 clang-format 统一格式常规编译入口pulsar-client-cpp/docker-build.sh通用编译脚本默认使用apachepulsar/pulsar-build这些脚本统一通过环境变量BUILD_IMAGE_NAME覆盖镜像名默认值均为apachepulsar/pulsar-build例如 build-client-lib.sh、build-wheels.sh。本地构建 pulsar-build 镜像在仓库根目录下执行以下命令即可在本地构建镜像默认 Dockerfile 位于build/docker基础镜像为ubuntu:16.04docker build -t pulsar-build .该命令使用 build/docker/Dockerfile 完成构建。需要说明的是此命令生成的镜像 tag 为pulsar-build而仓库内 C 客户端脚本默认引用的完整镜像名为apachepulsar/pulsar-build如需在本地替代线上镜像使用可改用完整命名docker build -t apachepulsar/pulsar-build:ubuntu-16.04 .深入 Dockerfile镜像内预置的完整工具链build/docker/Dockerfile 基于ubuntu:16.04依次安装并配置了 C 客户端编译、网站构建所需的全部依赖其内容可直接视为该镜像的技术规格说明。基础镜像与工作目录FROM ubuntu:16.04 # prepare the directory for pulsar related files RUN mkdir /pulsar镜像内预建了/pulsar目录用于挂载 Pulsar 源码。仓库中的实际调用脚本正是利用这一约定build-client-lib.sh与build-wheels.sh都以-v $ROOT_DIR:/pulsar的方式将仓库根目录挂载进容器然后在容器内执行/pulsar/pulsar-client-cpp/docker/...下的构建脚本。C 客户端编译依赖RUN apt-get update \ apt-get install -y software-properties-common \ add-apt-repository ppa:openjdk-r/ppa \ apt-get update \ apt-get install -y tig g cmake libssl-dev libcurl4-openssl-dev \ liblog4cxx-dev google-mock libgtest-dev \ libboost-dev libboost-program-options-dev libboost-system-dev libboost-python-dev \ libxml2-utils protobuf-compiler wget \ curl doxygen openjdk-8-jdk-headless openjdk-11-jdk-headless clang-format-5.0 \ gnupg2 golang-1.13-go zip unzip libzstd-dev libsnappy-dev python3-pip libpython-dev wireshark-dev这一行包罗了编译libpulsar所需的完整工具链逐项对应的作用如下依赖在构建中的作用g、cmakeC 编译与 CMake 构建系统见 pulsar-client-cpp/CMakeLists.txtlibssl-dev、libcurl4-openssl-devTLS 加密与 HTTP 相关功能lookup、OAuth2 认证等liblog4cxx-dev日志框架 Log4cxxLog4cxxLogger.cclibboost-dev及libboost-*-dev系列Boost 库线程、program-options、Python 绑定等libgtest-dev、google-mock单元测试框架对应 pulsar-client-cpp/tests/ 下的测试代码protobuf-compiler编译.proto定义Pulsar 协议见 pulsar-common/src/main/proto/openjdk-8-jdk-headless、openjdk-11-jdk-headless双 JDK 环境供 Pulsar 多版本 Java 代码编译与测试使用clang-format-5.0代码格式化供 docker-format.sh 调用golang-1.13-go编译 Go 相关组件如 pulsar-function-golibzstd-dev、libsnappy-dev压缩算法支持ZStd、Snappy对应 CompressionCodecZstd.cc 等python3-pip、libpython-devPython 客户端绑定构建wireshark-devWireshark 协议解析插件构建wireshark/pulsarDissector.cc源码编译 protobuf 3.xUbuntu 16.04 自带 apt 源的 protobuf 为 2.x无法满足 Pulsar 对 protobuf 3.x 的要求因此 Dockerfile 采用从源码编译的方式安装 protobuf 3.17.3RUN curl -O -L https://github.com/protocolbuffers/protobuf/releases/download/v3.17.3/protobuf-cpp-3.17.3.tar.gz \ tar xvfz protobuf-cpp-3.17.3.tar.gz \ cd protobuf-3.17.3/ \ CXXFLAGS-fPIC ./configure \ make -j8 make install \ cd .. rm -rf protobuf-3.17.3/ protobuf-cpp-3.17.3.tar.gz ENV LD_LIBRARY_PATH /usr/local/lib注意CXXFLAGS-fPIC因为编译产物需要链接进共享库/静态库位置无关代码是必须的。LD_LIBRARY_PATH/usr/local/lib则确保make install安装到/usr/local/lib下的 protobuf 运行时库能被后续链接期找到。从源码结构看Pulsar C 客户端使用 protobuf 生成协议消息的序列化代码见 pulsar-common/src/main/proto/PulsarApi.proto因此版本一致性是保证二进制兼容的前提。gtest 与 google-mock 的编译安装# Compile and install gtest RUN cd /usr/src/gtest cmake . make cp libgtest.a /usr/lib # Compile and install google-mock RUN cd /usr/src/gmock cmake . make cp libgmock.a /usr/lib # Include gtest parallel to speed up unit tests RUN git clone https://github.com/google/gtest-parallel.gitUbuntu 的 gtest 包只提供源码需要手动编译后将静态库复制到/usr/lib。同时克隆gtest-parallel用于并行加速单元测试pulsar-client-cpp/tests/ 目录下有大量测试用例并行执行可显著缩短 CI 时间。Java 与网站构建工具链ENV JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk-amd64 ENV JAVA_HOME_11/usr/lib/jvm/java-1.11.0-openjdk-amd64JAVA_HOME与JAVA_HOME_11分别指向 JDK 8 与 JDK 11。从buildtools、pulsar-broker等模块的构建配置可以推断Pulsar 的 Maven 构建在部分模块编译/测试时需要在 JDK 8 与 JDK 11 之间切换因此镜像同时预置两套 JDK 并暴露对应的环境变量。紧接着是网站构建相关的依赖RVM 安装 Ruby 2.4.1对应 site2/website 的构建环境、Node.js 12 与 Yarn前端依赖管理、crowdin文档翻译同步、pip pdocPython 文档生成用于 site2/docs 相关内容的辅助构建。Maven 安装ARG MAVEN_VERSION3.6.3 ARG MAVEN_FILENAMEapache-maven-${MAVEN_VERSION}-bin.tar.gz ARG MAVEN_HOME/opt/maven ARG MAVEN_URLhttp://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/${MAVEN_FILENAME} ARG MAVEN_TMP/tmp/${MAVEN_FILENAME} RUN wget --no-verbose -O ${MAVEN_TMP} ${MAVEN_URL} RUN tar xzf ${MAVEN_TMP} -C /opt/ \ ln -s /opt/apache-maven-${MAVEN_VERSION} ${MAVEN_HOME} \ ln -s ${MAVEN_HOME}/bin/mvn /usr/local/bin镜像固定安装 Apache Maven 3.6.3并通过符号链接将mvn暴露到PATH保证仓库内所有 Maven 构建根 pom.xml 及各模块 pom在一致版本下执行。构建完成后该构建参数即被释放unset MAVEN_VERSION不影响运行时环境。发布 pulsar-build 镜像只有具备相应权限的 committer 才有权向apachepulsar这个 Docker Hub 组织推送镜像。发布流程分为两步先构建镜像再推送镜像。构建镜像docker build -t apachepulsar/pulsar-build:ubuntu-16.04 .推送镜像publish.shpublish.sh 的完整逻辑如下ROOT_DIR$(git rev-parse --show-toplevel) cd $ROOT_DIR/build/docker if [ -z $DOCKER_USER ]; then echo Docker user in variable \$DOCKER_USER was not set. Skipping image publishing exit 1 fi if [ -z $DOCKER_PASSWORD ]; then echo Docker password in variable \$DOCKER_PASSWORD was not set. Skipping image publishing exit 1 fi DOCKER_ORG${DOCKER_ORG:-apachepulsar} docker login ${DOCKER_REGISTRY} -u$DOCKER_USER -p$DOCKER_PASSWORD if [ $? -ne 0 ]; then echo Failed to loging to Docker Hub exit 1 fi if [[ -z ${DOCKER_REGISTRY} ]]; then docker_registry_org${DOCKER_ORG} else docker_registry_org${DOCKER_REGISTRY}/${DOCKER_ORG} echo Starting to push images to ${docker_registry_org}... fi set -x # Fail if any of the subsequent commands fail set -e # Push all images and tags docker push ${docker_registry_org}/pulsar-build:ubuntu-16.04 echo Finished pushing images to ${docker_registry_org}脚本行为可以归纳为权限校验通过git rev-parse --show-toplevel定位仓库根目录并切换到build/docker若未设置DOCKER_USER或DOCKER_PASSWORD环境变量则直接退出并跳过推送返回码 1。组织与注册表DOCKER_ORG默认apachepulsar可通过环境变量DOCKER_REGISTRY指定自定义注册表此时推送目标变为${DOCKER_REGISTRY}/${DOCKER_ORG}/pulsar-build:ubuntu-16.04。登录与推送使用docker login完成认证失败即退出随后在set -e保护下执行docker push将ubuntu-16.04标签推送至目标组织。由此可见发布权限的控制体现在两点一是仓库访问权限仅 committer 拥有apachepulsar组织的推送权限二是脚本对DOCKER_USER/DOCKER_PASSWORD的强校验。对普通用户而言直接使用 Docker Hub 上已发布的镜像即可无需自行推送。镜像的工程落地以 C 客户端与 Python wheel 构建为例pulsar-build镜像是 Pulsar 官方 CI 发布链路的基石下面以两个真实脚本说明它的用法。构建 C 客户端库build-client-lib.sh 使用manylinux系列镜像编译客户端库BUILD_IMAGE_NAME${BUILD_IMAGE_NAME:-apachepulsar/pulsar-build} PYTHON_VERSIONS( 3.6 cp36-cp36m ) for line in ${PYTHON_VERSIONS[]}; do read -r -a PY $line PYTHON_VERSION${PY[0]} PYTHON_SPEC${PY[1]} IMAGE_NAME$BUILD_IMAGE_NAME:manylinux-$PYTHON_SPEC VOLUME_OPTION${VOLUME_OPTION:--v $ROOT_DIR:/pulsar} COMMAND/pulsar/pulsar-client-cpp/docker/build-client-lib-within-docker.sh DOCKER_CMDdocker run -i ${VOLUME_OPTION} ${IMAGE_NAME} $DOCKER_CMD bash -c ${COMMAND} done关键点-v $ROOT_DIR:/pulsar将仓库挂载到镜像预建的/pulsar目录容器内执行仓库自带的build-client-lib-within-docker.sh。这也印证了 Dockerfile 中mkdir /pulsar的设计意图。构建 Python wheel 并推送build-wheels.sh 支持按 Python 版本循环构建 wheel并允许通过命令行参数只构建指定版本从 python-versions.sh 读取受支持的版本组合未匹配则报错退出构建完成后push-images.sh 将各变体镜像打上apachepulsar/pulsar-build:base-pythonspec-arch标签并推送从而覆盖不同 Python 版本与架构的组合需求。运行测试与格式化docker-tests.sh 在镜像内运行 C 单元测试docker-format.sh 调用镜像内预装的clang-format-5.0统一代码风格。这些脚本共同说明pulsar-build不只是编译一次的工具而是贯穿 Pulsar C 客户端编译—打包—测试—格式化全流程的标准环境。小结build/docker目录下的pulsar-build镜像通过把 C 编译链g/CMake/protobuf/gtest、Java 双 JDK、Maven、以及网站构建所需的 Ruby/Node/Yarn/crowdin/pdoc 全部固化在ubuntu:16.04基础镜像中为 Apache Pulsar 的 C 客户端与官网构建提供了统一、可复现的执行环境。普通用户可直接使用 Docker Hub 上发布的apachepulsar/pulsar-build:tag镜像committer 则可通过 publish.sh 完成新版本镜像的发布。理解该镜像的构成与用法是参与 Pulsar C 客户端开发、排障与发布的前提。【免费下载链接】pulsarApache Pulsar - distributed pub-sub messaging system项目地址: https://gitcode.com/gh_mirrors/pulsar28/pulsar创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/23 5:12:34

Chinese-CLIP中文图文检索系统:CPU本地部署实战指南

简介:本资源是一份面向计算机视觉课程学习者与本科生的图文跨模态检索系统实践项目,聚焦Chinese-CLIP模型在中文场景下的实际应用,适用于期末大作业、课程设计及AI入门实战。压缩包共59个文件,含40个Python源码(涵盖ap…

2026/9/23 5:12:34

合同类别最佳实践:5类核心模式选型指南与避坑详解

合同类别最佳实践:5类核心模式选型指南与避坑详解 配置环境就卡半天,往往不是因为你手慢,而是因为你没搞懂底层逻辑。很多团队在微服务架构中处理合同数据时,习惯性地堆砌业务逻辑,导致代码耦合严重,一旦需求变更,改一行代码就得排查三个模块。这种“…

2026/9/23 5:07:33

告别配置噩梦:用Python写个提前还款计算器,性能优化实操

告别配置噩梦:用Python写个提前还款计算器,性能优化实操 装库报错、路径冲突、环境版本打架,是不是每次搞点开发配置环境就卡半天?这种痛苦我懂。其实很多工具类小项目,根本不需要复杂的工程化结构,核心逻辑一旦跑通,剩下的就是 性能优化…

2026/9/23 6:12:35

别被超大屏幕智能手机带偏:前端适配保姆级教程与避坑指南

别被超大屏幕智能手机带偏:前端适配保姆级教程与避坑指南 看了一堆教程还是不会写项目?这种无力感我懂。视频里代码跑通了,一到真实场景就抓瞎。这篇 保姆级教程 专门针对 超大屏幕智能手机 的适配难题,帮你从根源上解决布局崩坏问题。…

2026/9/23 6:12:35

手写实现数独游戏:面试被问原理答不上来?这篇救急

手写实现数独游戏:面试被问原理答不上来?这篇救急 面试时面试官轻飘飘一句:“手写实现一个数独游戏的求解器,讲讲你的思路。” 很多人脑子瞬间空白。不是没写过,是没把 手写实现 数独游戏的核心逻辑吃透。…

2026/9/23 6:12:35

ER图从入门到实战:实体关系建模与数据库设计核心指南

1. 一个让我彻底重视ER图的真实场景先说个我自己的经历。几年前我带一个小型项目,负责设计用户、订单、商品、库存模块的数据库。当时觉得业务简单,随手建了十来张表,外键看心情加,字段命名全凭直觉。结果上线三个月后&#xff0c…

2026/9/23 6:12:35

广州到珠海长隆交通方案对比:从入门到精通的实战指南

广州到珠海长隆交通方案对比:从入门到精通的实战指南 刚拿到车钥匙或者第一次带家人去珠海长隆的朋友,是不是也被“广州到珠海长隆”这个关键词搜出来的海量攻略搞晕了?官方文档太长抓不住重点,小红书帖子又是碎片化的种草,根本没法形成系统性的认知。很…

2026/9/23 6:07:35

OpenHarmony PWM风扇调速实战:从硬件接线到FG转速反馈全解析

做OpenHarmony外设开发,GPIO用顺手之后,你大概率会碰到一个需求:给开发板加一个可调速的散热风扇。有人会说,风扇调速嘛,把电压调低不就完了?如果你真这么干过,就会发现问题一大堆:降…

2026/9/22 10:02:42

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/22 9:07:39

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/23 0:01:54

3个实战技巧搞定形式英语:从看教程到跑通性能优化

3个实战技巧搞定形式英语:从看教程到跑通性能优化 看了一堆教程还是不会写项目?别慌,这种“眼高手低”的困境在开发者圈子里太常见了。很多人以为卡点在语法,其实真正拦路虎是缺乏将知识点串联成完整链路的能力。今天咱们不聊虚的,直接拿【形式英语】这…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码