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。它定义了若干可调参数与四个构建阶段:
可调构建参数
| 参数 | 默认值 | 作用 |
|---|---|---|
builder | starrocks/dev-env-ubuntu:latest | 编译阶段的基础镜像 |
RELEASE_VERSION | 空 | 注入org.starrocks.version标签的版本号 |
BUILD_TYPE | Release | 后端编译模式,可取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.sh与cn_entrypoint.sh,见 be/README.md)。
由此可见,一份 Artifacts 镜像 + 不同运行时 Dockerfile = FE、BE、CN、All-in-One 多种 k8s 部署镜像,这正是该设计"产物一次构建、多场景复用"的核心价值。
实操自查清单
- 确认
DOCKER_BUILDKIT=1已启用(多阶段并行构建依赖 BuildKit); - 按"分支 + 发行版"规则选定正确的
starrocks/dev-env-${distro}:${branch}-latest镜像; - 在仓库根目录执行构建,
-f指向docker/dockerfiles/artifacts/artifact.Dockerfile,上下文为../../..; - 用
docker push发布前先完成 ghcr.io 登录与权限确认; - 下游构建运行时镜像时,将
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),仅供参考