StarRocks Artifacts 镜像构建与发布指南:基于 Busybox 的 FE/BE 构件载体
2026/9/15 15:47:35 网站建设 项目流程

StarRocks Artifacts 镜像构建与发布指南:基于 Busybox 的 FE/BE 构件载体

【免费下载链接】starrocksThe world's 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

本指南以仓库 docker/dockerfiles/artifacts/README.md 为骨架,完整讲解 StarRocks Artifacts 镜像的设计动机、构建命令与发布流程,并结合 artifact.Dockerfile 及下游 fe/be/allin1 镜像的源码实现,说明它如何在多阶段 Docker 构建流水线中充当"构件搬运工",最终支撑 Kubernetes 各类运行时镜像的产出。读完本文,你将掌握为 Ubuntu 与 CentOS 7 发行版构建并推送 StarRocks Artifacts 镜像的完整命令,并理解它与 dev-env 镜像、运行时镜像之间的调用关系。

Artifacts 镜像是什么:一段 1MB 的"构件快递"

StarRocks 的容器化构建采用封闭式(hermetic)多阶段 Docker 构建环境(见 docker/dockerfiles/README.md)。在这个流水线中,Artifacts 镜像承担的角色非常特殊:

  • 它以Busybox为基础镜像。Busybox 镜像体积仅约 1MB,不含任何多余的包管理器与运行库;
  • 构建阶段(fe-builder / be-builder / downloader)在功能完整的 dev-env 镜像中完成 FE、BE 及 broker 的编译产物产出;
  • 最终阶段把三类产物统一拷贝进 Busybox 基础镜像,得到一份只装产物、不带编译环境的精简镜像;
  • 这份 Artifacts 镜像随后作为"载体",把构件传递到 Docker 构建的下一个阶段,用于打包成各种类型的 Kubernetes 部署运行时镜像(FE 镜像、BE/CN 镜像、All-in-One 镜像等)。

也就是说,Artifacts 镜像本身不用于直接运行 StarRocks,而是编译产物在流水线各阶段之间的传递介质。由于它不携带工具链和运行时依赖,体积被压缩到极致,搬运成本几乎可以忽略。

构建前的前置知识:如何选择正确的 dev-env 基础镜像

构建 Artifacts 镜像前,必须先用合适的 dev-env 镜像编译 FE/BE 源码。dev-env 镜像的命名与选择遵循如下规则:

如果构件来自branch-x分支、面向 linux 发行版distro,则应使用对应的starrocks/dev-env-${distro}:${branch}-latest

例如:

  • 面向Ubuntu发行版、基于branch-3.0分支构建,应使用starrocks/dev-env-ubuntu:branch-3.0-latest
  • 面向Ubuntu发行版、基于main分支构建,应使用starrocks/dev-env-ubuntu:main-latest
  • 面向CentOS 7发行版,则对应starrocks/dev-env-centos7:main-latest

dev-env 镜像本身由 dev-env/dev-env.Dockerfile 构建,其中预装全部开发工具、预编译的 StarRocks thirdparty 依赖以及 Maven 依赖缓存,并以distro构建参数区分 Ubuntu / CentOS 7 / Rocky 9 三个发行版(见 dev-env/README.md)。Artifacts 镜像的构建命令通过--build-arg builder=...把这一选择注入到artifact.Dockerfile中。

一、为 Ubuntu 构建 StarRocks Artifacts 镜像

构建 Ubuntu 版 Artifacts 镜像的命令如下(需在仓库根目录执行):

DOCKER_BUILDKIT=1 docker build --build-arg builder=starrocks/dev-env-ubuntu:<branch>-latest -f artifact.Dockerfile -t ghcr.io/OWNER/starrocks/artifact-ubuntu:<tag> ../../..

实际示例(main 分支):

DOCKER_BUILDKIT=1 docker build --build-arg builder=starrocks/dev-env-ubuntu:main-latest -f artifact.Dockerfile -t ghcr.io/starrocks/starrocks/artifact-ubuntu:main ../../..

命令拆解:

参数/部分含义
DOCKER_BUILDKIT=1启用 BuildKit,以并行化多阶段构建,提升构建速度(该流水线的并行性依赖此特性)
--build-arg builder=starrocks/dev-env-ubuntu:main-latest指定编译 FE/BE 源码所用的 dev-env 基础镜像
-f artifact.Dockerfile指定使用docker/dockerfiles/artifacts/目录下的 Artifacts 构建文件
-t ghcr.io/OWNER/starrocks/artifact-ubuntu:<tag>为产物镜像打标签,OWNER替换为你的 ghcr.io 命名空间
../../..构建上下文指向仓库根目录(artifact.Dockerfile位于docker/dockerfiles/artifacts/下,相对路径向上三级)

注意:artifact.Dockerfile的实际路径是docker/dockerfiles/artifacts/artifact.Dockerfile;当从仓库根目录执行上述命令时,-f artifact.Dockerfile依赖 docker build 的-f路径解析,官方注释中的等价写法为-f docker/dockerfiles/artifacts/artifact.Dockerfile(见该文件头部注释)。

二、发布 Ubuntu Artifacts 镜像到 ghcr.io

docker push ghcr.io/OWNER/starrocks/artifact-ubuntu:<tag>

实际示例:

docker push ghcr.io/starrocks/starrocks/artifact-ubuntu:main

发布前请确保已通过docker login ghcr.io完成 GitHub Container Registry 的身份认证,并确认该命名空间下具备推送权限。

三、为 CentOS 7 构建 StarRocks Artifacts 镜像

CentOS 7 版的构建流程与 Ubuntu 完全一致,只需把builder换成dev-env-centos7镜像、并把镜像名中的发行版标识改为centos7

DOCKER_BUILDKIT=1 docker build --build-arg builder=starrocks/dev-env-centos7:<branch>-latest -f artifact.Dockerfile -t ghcr.io/OWNER/starrocks/artifact-centos7:<tag> ../../..

实际示例(main 分支):

DOCKER_BUILDKIT=1 docker build --build-arg builder=starrocks/dev-env-centos7:main-latest -f artifact.Dockerfile -t ghcr.io/OWNER/starrocks/artifact-centos7:main ../../..

同一份artifact.Dockerfile即可产出 Ubuntu 与 CentOS 7 两种 Artifacts 镜像,区别仅在于builder参数。底层 dev-env 的 CentOS 7 版本由dev-env.Dockerfile中的--build-arg distro=centos7构建而来。

四、发布 CentOS 7 Artifacts 镜像到 ghcr.io

docker push ghcr.io/OWNER/starrocks/artifact-centos7:<tag>

实际示例:

docker push ghcr.io/starrocks/starrocks/artifact-centos7:main

源码纵深:artifact.Dockerfile 内部的三段式构建

要真正理解 Artifacts 镜像,需要走进 artifact.Dockerfile。它定义了若干可调参数与四个构建阶段:

可调构建参数

参数默认值作用
builderstarrocks/dev-env-ubuntu:latest编译阶段的基础镜像
RELEASE_VERSION注入org.starrocks.version标签的版本号
BUILD_TYPERelease后端编译模式,可取Release/DEBUG/ASAN
MAVEN_OPTS-Dmaven.artifact.threads=128传给 FE Maven 构建的 JVM 参数
BUILD_ROOT/build仓库源码在容器内的拷贝目录

阶段一:fe-builder —— 编译 FE 与 Broker

FROM ${builder} as fe-builder COPY . ${BUILD_ROOT} RUN --mount=type=cache,target=/root/.m2/ STARROCKS_VERSION=${RELEASE_VERSION} BUILD_TYPE=${BUILD_TYPE} MAVEN_OPTS=${MAVEN_OPTS} ./build.sh --fe --with-maven-batch-mode ON --clean RUN --mount=type=cache,target=/root/.m2/ cd fs_brokers/apache_hdfs_broker/ && STARROCKS_VERSION=${RELEASE_VERSION} MAVEN_OPTS=${MAVEN_OPTS} ./build.sh
  • 复用 dev-env 中预置的编译工具链与 Maven 仓库;
  • --mount=type=cache,target=/root/.m2/是 BuildKit 的缓存挂载,跨构建复用 Maven 依赖缓存,显著加速迭代;
  • 第一阶段同时产出 FE 产物与 HDFS Broker 产物(后者位于fs_brokers/apache_hdfs_broker/output)。

阶段二:be-builder —— 并行编译 BE

FROM ${builder} as be-builder RUN --mount=type=cache,target=/root/.m2/ STARROCKS_VERSION=${RELEASE_VERSION} BUILD_TYPE=${BUILD_TYPE} MAVEN_OPTS=${MAVEN_OPTS} ./build.sh --be --enable-shared-data --clean -j `nproc`
  • 与 FE 构建在两个独立 stage 中并行执行,这正是 docker/dockerfiles/README.md 所述"利用 BuildKit 并行构建以获取最优速度"的实现;
  • --enable-shared-data表明该流水线产物支持存算分离场景;
  • -j $(nproc)按宿主机核数启用并行编译。

阶段三:downloader —— 下载诊断工具

FROM ubuntu:24.04 as downloader ARG DD_AGENT_VERSION ... ADD ${FINAL_DOWNLOAD_URL} /datadog/dd-java-agent.jar ADD 'https://arthas.aliyun.com/arthas-boot.jar' /arthas/arthas-boot.jar RUN wget ... ddprof ... -O /datadog/ddprof

该阶段预下载三类 Java/性能诊断组件:DataDog Java Agent(dd-java-agent.jar,可用DD_AGENT_VERSION固定版本,缺省取最新)、Arthas 诊断工具(arthas-boot.jar)以及用于 BE 性能剖析的ddprof

阶段四:busybox 终态 —— 组装精简产物镜像

FROM busybox:latest LABEL org.opencontainers.image.source="https://github.com/starrocks/starrocks" LABEL org.starrocks.version=${RELEASE_VERSION:-"UNKNOWN"} COPY --from=fe-builder ${BUILD_ROOT}/output /release/fe_artifacts COPY --from=be-builder ${BUILD_ROOT}/output /release/be_artifacts COPY --from=fe-builder ${BUILD_ROOT}/fs_brokers/apache_hdfs_broker/output /release/broker_artifacts COPY --from=downloader /arthas/arthas-boot.jar /release/fe_artifacts/fe/arthas/arthas-boot.jar COPY --from=downloader /datadog/dd-java-agent.jar /release/fe_artifacts/fe/datadog/dd-java-agent.jar COPY --from=downloader /datadog/ddprof /release/be_artifacts/be/datadog/ddprof WORKDIR /release

最终镜像内部分区明确:

  • /release/fe_artifacts:FE 产物;
  • /release/be_artifacts:BE 产物;
  • /release/broker_artifacts:HDFS Broker 产物;
  • FE 目录内预置 Arthas 与 DataDog Java Agent,BE 目录内预置 ddprof,便于运行时诊断。

下游消费:Artifacts 镜像如何进入运行时镜像

Artifacts 镜像不是终点,而是 k8s 运行时镜像的原料。FE、BE/CN、All-in-One 三类运行时镜像的 Dockerfile 均支持两种产物来源(以ARTIFACT_SOURCE参数区分):

  • image:从 Artifacts 镜像拷贝构件(生产流水线路径);
  • local:从本地构建目录output/拷贝构件(本地开发调试路径)。

以 fe-ubuntu.Dockerfile 为例:

ARG ARTIFACTIMAGE=starrocks/artifacts-ubuntu:latest FROM ${ARTIFACTIMAGE} AS artifacts-from-image ... FROM artifacts-from-${ARTIFACT_SOURCE} AS artifacts ... COPY --from=artifacts --chown=$USER:$GROUP /release/fe_artifacts/ $STARROCKS_ROOT/

be-ubuntu.Dockerfile 的结构相同,且会额外删除 BE 的.debuginfo符号文件以缩减体积。实际构建命令(见 fe/README.md 与 be/README.md):

# 从 Artifacts 镜像打包 FE 运行时镜像 DOCKER_BUILDKIT=1 docker build --build-arg ARTIFACT_SOURCE=image --build-arg ARTIFACTIMAGE=ghcr.io/starrocks/starrocks/artifact-ubuntu:main -f fe-ubuntu.Dockerfile -t fe-ubuntu:main ../../.. # 从 Artifacts 镜像打包 BE/CN 运行时镜像 DOCKER_BUILDKIT=1 docker build --build-arg ARTIFACT_SOURCE=image --build-arg ARTIFACTIMAGE=ghcr.io/starrocks/starrocks/artifact-ubuntu:main -f be-ubuntu.Dockerfile -t be-ubuntu:main ../../..

allin1-ubuntu.Dockerfile 同样以ARTIFACTIMAGE=ghcr.io/starrocks/starrocks/artifact-ubuntu:main作为默认产物来源,构建启动即拉起完整 FE + BE 集群栈的开发测试镜像。CN 镜像与 BE 镜像共享同一产物,仅入口脚本不同(be_entrypoint.shcn_entrypoint.sh,见 be/README.md)。

由此可见,一份 Artifacts 镜像 + 不同运行时 Dockerfile = FE、BE、CN、All-in-One 多种 k8s 部署镜像,这正是该设计"产物一次构建、多场景复用"的核心价值。

实操自查清单

  1. 确认DOCKER_BUILDKIT=1已启用(多阶段并行构建依赖 BuildKit);
  2. 按"分支 + 发行版"规则选定正确的starrocks/dev-env-${distro}:${branch}-latest镜像;
  3. 在仓库根目录执行构建,-f指向docker/dockerfiles/artifacts/artifact.Dockerfile,上下文为../../..
  4. docker push发布前先完成 ghcr.io 登录与权限确认;
  5. 下游构建运行时镜像时,将ARTIFACTIMAGE指向刚发布的 Artifacts 镜像标签,保持发行版一一对应(Ubuntu 产物配 Ubuntu 运行时,CentOS 7 产物配 CentOS 7 运行时)。

参考路径速查

  • 关联文档:docker/dockerfiles/artifacts/README.md
  • 构建文件:docker/dockerfiles/artifacts/artifact.Dockerfile
  • 流水线总览:docker/dockerfiles/README.md
  • dev-env 镜像:docker/dockerfiles/dev-env/README.md 与 dev-env.Dockerfile
  • FE 运行时镜像:docker/dockerfiles/fe/fe-ubuntu.Dockerfile
  • BE/CN 运行时镜像:docker/dockerfiles/be/be-ubuntu.Dockerfile
  • All-in-One 镜像:docker/dockerfiles/allin1/README.md

【免费下载链接】starrocksThe world's 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询