使用 Docker 开发镜像编译 StarRocks:从环境搭建到源码级编译实战
发布时间:2026/9/16 20:53:13 作者:尧图编辑部 阅读量:1,286

使用 Docker 开发镜像编译 StarRocks从环境搭建到源码级编译实战【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks本篇技术指南以 StarRocks 官方文档《Compile StarRocks with Docker》为核心系统讲解如何基于 StarRocks 提供的 Ubuntu、Rocky Linux 开发环境镜像在 Docker 容器中从源码编译 StarRocks。文中不仅完整覆盖镜像选择、容器启动与编译命令还结合仓库内docker/dockerfiles/dev-env/的镜像构建定义与根目录 build.sh 的参数体系深入剖析镜像内容、编译流程与常见排障方法帮助你在一台仅有 Docker 的机器上快速获得可运行的 StarRocks 二进制产物。为什么选择在 Docker 中编译 StarRocksStarRocks 是一个体量庞大的 C/Java 混合工程后端BackendBE依赖数十个第三方库前端FrontendFE依赖成百上千个 Maven 构件。手工在宿主机上准备编译工具链与第三方依赖成本极高、且极易因环境差异失败。为此StarRocks 官方在 docker/dockerfiles/dev-env/ 目录维护了一套开箱即用的开发环境镜像构建脚本把编译工具链、第三方依赖库、Maven 依赖全部预装进镜像。从仓库中的 dev-env.Dockerfile 可以看到镜像的分层构建逻辑base层基于starrocks/toolchains-${distro}工具链镜像设置环境变量STARROCKS_THIRDPARTY/var/local/thirdparty即第三方库的统一安装根目录builder_stage1层将仓库源码复制进镜像运行build-thirdparty.sh预编译全部第三方依赖并复制到$STARROCKS_THIRDPARTYstarlet阶段按发行版拉取对应的 starletshared-data 模式依赖制品最终dev-env层汇总第三方依赖、Maven 缓存/root/.m2与 starlet 制品设置STARROCKS_GCC_HOME路径等。这意味着你拉取的镜像中最耗时的第三方库编译与 Maven 依赖下载已经完成进入容器后只需直接运行./build.sh即可。版本与开发镜像的对应关系不同 StarRocks 分支对应不同的开发环境镜像镜像托管于 StarRocks 官方 Docker Hub 的starrocks组织下。选错镜像可能导致编译工具链与目标分支不匹配务必按下表一一对应Ubuntuv4.1 及更早使用 22.04v4.2 及以后使用 24.04分支名镜像名mainstarrocks/dev-env-ubuntu:latestbranch-4.1starrocks/dev-env-ubuntu:4.1-latestbranch-4.0starrocks/dev-env-ubuntu:4.0-latestbranch-3.5starrocks/dev-env-ubuntu:3.5-latestCentOS 7.9v4.1 及更早v4.2 起停止提供分支名镜像名branch-4.1starrocks/dev-env-centos7:4.1-latestbranch-4.0starrocks/dev-env-centos7:4.0-latestbranch-3.5starrocks/dev-env-centos7:3.5-latestRocky Linux 9v4.2 及以后分支名镜像名mainstarrocks/dev-env-rocky9:latest:::note 版本变更说明自 v4.2 起CentOS 7 已于 2024 年 6 月 30 日停止维护End-of-Life其构建发行随之终止由 Rocky Linux 9 替代CentOS 7 镜像仅保留给 v4.1 及更早版本使用。Ubuntu 开发环境从 Ubuntu 22.04v4.1 及更早升级为 Ubuntu 24.04v4.2 及以后镜像名starrocks/dev-env-ubuntu保持不变。 :::关于镜像内部的工具链细节可参考 toolchains-ubuntu.Dockerfile 中的注释Ubuntu 工具链镜像自带 gcc 14.3.0源码编译、JDK 21、cmake 3.31.9、Maven 3.8.7、lld 18.1.3 等并默认设置STARROCKS_LINKERlld与JAVA_HOME。前置条件开始编译前请确认你的机器满足硬件至少8 GB 内存BE 的 C 编译非常吃内存详见文末排障。软件操作系统为 Ubuntu 22.04 或 24.04、CentOS 7.9、Rocky Linux 9 之一已安装 Docker版本不低于v20.10.10。Step 1拉取开发环境镜像# 将 image_name 替换为你要下载的镜像名 # 例如 starrocks/dev-env-ubuntu:latest。 # 请务必为你的操作系统选择正确的镜像。 docker pull image_nameDocker 会自动识别你机器的 CPU 架构并拉取对应镜像linux/amd64面向 x86 平台linux/arm64面向 ARM 平台。Step 2在 Docker 容器中编译 StarRocks启动容器有两种方式挂载宿主机路径与不挂载。官方推荐前者——好处有两个一是 Maven 依赖缓存在宿主机上下次编译无需重新下载 Java 依赖二是编译产物直接落在宿主机无需手动从容器拷贝二进制文件。方式一挂载宿主机路径推荐将 StarRocks 源码克隆到宿主机git clone starrocks-源码仓库地址当前仓库的代码地址为 https://gitcode.com/GitHub_Trending/st/starrocks 克隆后源码目录名为starrocks。启动容器# 将 code_dir 替换为 StarRocks 源码目录的父目录。 # 将 branch_name 替换为与镜像名对应的分支名。 # 将 image_name 替换为你已下载的镜像名。 docker run -it -v code_dir/.m2:/root/.m2 \ -v code_dir/starrocks:/root/starrocks \ --name branch_name -d image_name两个挂载点的作用-v code_dir/.m2:/root/.m2把 Maven 本地仓库映射到容器内/root/.m2。dev-env 镜像在构建阶段prebuild_maventrue时已通过./build.sh --fe预热过 FE 的 Maven 依赖并缓存到/root/.m2挂载后这份缓存可被后续编译复用避免重复下载镜像中 Maven 的 localRepository 配置见 docker/dockerfiles/dev-env/mvn/settings.xml-v code_dir/starrocks:/root/starrocks将宿主机源码目录映射到容器内/root/starrocks使容器内编辑与构建共享同一份源码编译产物默认在output/目录也直接落在宿主机。进入容器内的 bash 交互环境# 将 branch_name 替换为与镜像名对应的分支名。 docker exec -it branch_name /bin/bash在容器内编译cd /root/starrocks ./build.sh方式二不挂载宿主机路径启动容器# 将 branch_name 替换为与镜像名对应的分支名。 # 将 image_name 替换为你已下载的镜像名。 docker run -it --name branch_name -d image_name进入容器内的 bash# 将 branch_name 替换为与镜像名对应的分支名。 docker exec -it branch_name /bin/bash在容器内克隆源码git clone starrocks-源码仓库地址编译cd starrocks ./build.sh注意此方式下 Maven 缓存和编译产物都在容器内下次编译需重新下载依赖产物需通过docker cp拷贝出容器。深入理解 build.sh默认编译什么、产物在哪无论哪种方式最终执行的./build.sh都是仓库根目录的构建入口。根据 build.sh 的脚本逻辑不带任何参数执行时默认同时构建BEBackend、FEFrontend、Spark Dpp 应用与 Hive UDF脚本首先检查protoc、thrift等工具并校验$STARROCKS_THIRDPARTY/installed下的第三方依赖是否就绪dev-env 镜像已预装之后依次完成 gensrc 代码生成、BE 的 CMake 配置与make -j编译、Java Extensions 打包、FE 各模块的 Maven 打包成功后所有二进制统一汇总到根目录output/下目录结构为output/be/含starrocks_be主程序、lib/下各.so与 JNI 包和output/fe/含starrocks-fe.jar、lib/、conf/等。output/即是一套可直接启动的部署目录。更详细的构建选项说明见 docs/en/developers/build-starrocks/handbook.md。进阶按需裁剪与调优编译参数如果只想编译部分组件或在容器内调整编译方式可以直接复用build.sh支持的大量参数完整列表见 build.sh 的 usage 说明# 只编译 Backend ./build.sh --be # 只编译 Frontend含 Spark Dpp 应用 ./build.sh --fe # 清理后重新编译 FE 与 BE ./build.sh --fe --be --clean # 指定并行度编译 BE-j 可覆盖自动检测的并行数 ./build.sh --be -j 32 # 指定输出目录 ./build.sh --be --output PATH构建类型BUILD_TYPE默认为Release可切换为Debug或ASAN例如BUILD_TYPEASAN ./build.sh --be注意脚本中对冲突参数有显式校验BUILD_TYPEASAN与--with-gcov不能同时开启--format-lib不能与--be同时指定。切换链接器STARROCKS_LINKER默认链接器较慢可显式指定lld加速链接Ubuntu 工具链镜像已内置 lldSTARROCKS_LINKERlld ./build.sh --be其他常用开关--without-connector-jdbc/--without-connector-mysql等可裁剪 BE 的 connector 以减小体积--with-glibc-compat可为 BE 二进制做 glibc 向下兼容构建后脚本会调用build-support/check_glibc_abi.sh校验 ABI 下限--without-pch关闭预编译头--enable-shared-data即已废弃的--use-staros开启 shared-data 模式支持此时需保证镜像内STARLET_INSTALL_DIR默认$STARROCKS_THIRDPARTY/installed/starlet指向有效的 starlet 制品这正是 dev-env 镜像中专门引入 starlet 阶段的原因。常见问题排查QStarRocks BE 编译失败报错如下g: fatal error: Killed signal terminated program cc1plus compilation terminated.A该错误说明 Docker 容器内存不足——cc1plus是 g 的前端进程编译大型 C 文件时内存占用极高被系统 OOM 杀掉。请为容器分配至少 8 GB 内存如在 Docker Desktop 的 Settings → Resources 中调整或用docker run -m 8g显式限制并建议用-j适当调低并行度以降低瞬时内存峰值。参考资料仓库内可直接查阅的实现文件Build_in_docker.md本文对应的官方英文文档原文handbook.md构建总览、单测运行与构建选项说明build.sh编译入口脚本含全部构建参数与产物装配逻辑dev-env.Dockerfile开发环境镜像的分层构建定义第三方依赖、Maven 缓存、starlet 制品dev-env/README.md镜像构建与推送命令toolchains-ubuntu.DockerfileUbuntu 工具链镜像的 gcc/JDK/cmake/Maven/lld 版本清单。掌握以上内容后你便可以在任意装有 Docker 的机器上用最少的步骤复现 StarRocks 的完整编译流程并依据业务需要灵活裁剪构建参数快速产出 FE/BE 二进制进行部署或二次开发调试。【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考