首页/新闻资讯/正文详情

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

发布时间:2026/9/23 5:12:23 来源:云帆数科 栏目:资讯中心
使用 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),仅供参考

相关推荐

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

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

拒绝硬编码:refusing 在 Go 与 Rust 中的源码解析与实战选型
拒绝硬编码:refusing 在 Go 与 Rust 中的源码解析与实战选型

拒绝硬编码:refusing 在 Go 与 Rust 中的源码解析与实战选型 复制来的代码跑不通,报错信息里藏着 refusing… · 2026/9/23 5:12:10

GitHub Trending周报:从热度到健康度的开源评估新范式
GitHub Trending周报:从热度到健康度的开源评估新范式

1. 这份周报不是“新闻简报”,而是开源世界的施工图纸你点开这份标题为《GitHub Trending 开源生态周报(2026-09-07 至 2026-09-13)》的文档时,大概率不是想看一串项目名字加星标数的流水账。我干这行十多年,从最早用 … · 2026/9/23 5:12:10

搞定平移不变性:手写实现避坑指南
搞定平移不变性:手写实现避坑指南

搞定平移不变性:手写实现避坑指南 配置环境就卡半天,这种体验谁懂?明明照着文档一步步敲,Python 环境配好了,PyTorch… · 2026/9/23 6:02:36

IgA肾病精准治疗:基因检测指导激素用药
IgA肾病精准治疗:基因检测指导激素用药

1. IgA肾病治疗现状与精准用药需求IgA肾病作为全球最常见的原发性肾小球肾炎,约占原发性肾小球疾病的40%。在临床实践中,糖皮质激素一直是治疗中高危IgA肾病的主要药物选择。然而,长期困扰肾内科医生的一个核心问题是:为什么有些患… · 2026/9/23 6:02:30

Python封装机制详解与实践指南
Python封装机制详解与实践指南

1. 为什么我们需要讨论Python封装在Python开发社区里,封装(encapsulation)可能是最常被误解的面向对象特性之一。很多开发者认为Python的封装机制很"弱",因为不像Java那样有严格的private修饰符。但实际情况是,Python提供了一套更灵… · 2026/9/23 6:02:30

植物的光合作用源码解析
植物的光合作用源码解析

3行代码看懂植物光合作用的性能优化逻辑 控制台炸出一串红色的 StackTrace,光标在 NullPointerException… · 2026/9/23 6:02:30

多无人机协同路径规划:基于Dubins路径的Matlab实现
多无人机协同路径规划:基于Dubins路径的Matlab实现

1. 项目背景与核心挑战在动态对抗环境中,多无人机系统的协同路径规划一直是学术界和工业界关注的焦点问题。传统单机路径规划方法难以应对复杂威胁环境下的实时避障、队形保持和任务分配等多重需求。这个项目针对性地提出了一种基于多段Dubins路径的协同策略&#x… · 2026/9/23 6:02:30

Flutter数据校验库鸿蒙化改造实践
Flutter数据校验库鸿蒙化改造实践

1. 项目背景与核心价值在鸿蒙应用开发领域,数据校验一直是保障业务逻辑稳定性的关键环节。Flutter生态中广受欢迎的data_validator库因其强大的多维校验能力,成为众多企业级应用的首选。但原生Flutter库无法直接在鸿蒙平台运行,这就需要对dat… · 2026/9/23 6:02:24

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码