使用 Docker 镜像编译 Apache Doris
本文介绍如何使用 Apache Doris 官方编译镜像编译 Doris 源码。该镜像由社区维护并随依赖及时更新,免去手动安装 toolchain 与三方库的过程,是最推荐的编译方式。
目前 Docker 镜像方式还不支持存算分离模式的编译部署。
适用人群与优缺点
| 维度 | 说明 |
|---|---|
| 适用人群 | 希望快速搭建编译环境、不想手动配置依赖的开发者 |
| 优点 | 镜像已预装 thirdparty、toolchain、JDK,开箱即用 |
| 缺点 | 需要本地有可用的 Docker 环境,镜像体积较大(约 3.3 GB) |
如果机器上没有 Docker 环境,可改用 LDB Toolchain 编译。
1. 安装 Docker
在 CentOS 上可直接通过包管理器安装:
yum install docker
其他发行版请参考 Docker 官方安装文档。
2. 选择并下载构建镜像
不同 Doris 版本对应不同的构建镜像。apache/doris:build-env-ldb-toolchain-latest 用于编译 master 主干代码,会随主干持续更新。
| 镜像 Tag | 适用 Doris 版本 | 备注 |
|---|---|---|
apache/doris:build-env-for-2.0 | 2.0.x | 支持 AVX2 指令集 |
apache/doris:build-env-for-2.0-no-avx2 | 2.0.x | 兼容不支持 AVX2 的 CPU |
apache/doris:build-env-for-2.1 | 2.1.x | 支持 AVX2 指令集 |
apache/doris:build-env-for-2.1-no-avx2 | 2.1.x | 兼容不支持 AVX2 的 CPU |
apache/doris:build-env-for-3.0 | 3.0.x | 支持 AVX2 指令集 |
apache/doris:build-env-for-3.0-no-avx2 | 3.0.x | 兼容不支持 AVX2 的 CPU |
apache/doris:build-env-for-3.1 | 3.1.x | 支持 AVX2 指令集 |
apache/doris:build-env-for-3.1-no-avx2 | 3.1.x | 兼容不支持 AVX2 的 CPU |
apache/doris:build-env-ldb-toolchain-latest | master | 跟随主干更新 |
apache/doris:build-env-ldb-toolchain-no-avx2-latest | master | 兼容不支持 AVX2 的 CPU |
以编译 Doris 2.0 为例,下载并检查镜像:
# 也可以使用 docker.io/apache/doris:build-env-for-2.0
docker pull apache/doris:build-env-for-2.0
# 确认镜像下载成功
docker images
# REPOSITORY TAG IMAGE ID CREATED SIZE
# apache/doris build-env-for-2.0 f29cf1979dba 3 days ago 3.3GB
镜像选择注意事项
- 镜像 Tag 与 Doris 版本一一对应,请按目标分支选择,避免跨版本编译。
no-avx2镜像中的第三方库可运行在不支持 AVX2 的 CPU 上,需配合USE_AVX2=0选项编译。- 镜像变更历史可参考 thirdparty CHANGELOG。
- 最新的
apache/doris:build-env-ldb-toolchain-latest(目前仅支持 x86_64 架构)同时包含 JDK 8 与 JDK 17:2.1(含)之前版本请使用 JDK 8,3.0(含)之后版本或 master 分支请使用 JDK 17。 - ARM64 架构下使用 Docker 编译时,需先下载支持 ARM64 的 Linux 基础镜像(如
apache/doris:base-latest,对应 Ubuntu 22.04.5 LTS),再参考 Linux 直接编译 和 ARM 平台编译 文档安装依赖后编译。
容器内可通过环境变量切换 JDK:
# 切换到 JDK 8
export JAVA_HOME=/usr/lib/jvm/java-1.8.0
export PATH=$JAVA_HOME/bin/:$PATH
# 切换到 JDK 17
export JAVA_HOME=/usr/lib/jvm/jdk-17.0.2/
export PATH=$JAVA_HOME/bin/:$PATH
3. 编译 Doris
3.1 下载 Doris 源码
在宿主机上获取目标分支代码(以 branch-2.0 为例):
git clone -b branch-2.0 https://github.com/apache/doris.git
假设源码目录为 ~/doris-branch-2.0。
3.2 启动构建容器
# 提前在宿主机准备 maven 的 .m2 目录,便于多次构建复用 Java 依赖
mkdir ~/.m2
# 挂载源码与 .m2 目录,启动构建镜像
docker run -it --network=host \
--name mydocker \
-v ~/.m2:/root/.m2 \
-v ~/doris-branch-2.0:/root/doris-branch-2.0/ \
apache/doris:build-env-for-2.0
# 命令执行成功后将自动进入容器
docker run 关键参数说明:
| 参数 | 作用 |
|---|---|
-v | 将宿主机目录挂载到容器,用于持久化源码与依赖 |
--name | 指定容器名称,便于后续管理 |
--network | 容器网络模式。host 表示与宿主机共享网络栈,无需端口映射 |
建议:
- 始终挂载 Doris 源码目录,保证编译产物保留在宿主机,容器退出后不丢失。
- 挂载
.m2目录,避免每次启动容器都重新下载 Maven 依赖。 - 容器内下载三方库需要访问外网,推荐使用
--network=host模式。
3.3 执行构建
容器内进入源码目录后运行:
# 默认编译支持 AVX2 的产物
sh build.sh
# CPU 不支持 AVX2 时需附加 USE_AVX2=0
USE_AVX2=0 sh build.sh
# 编译 Debug 版本 BE
BUILD_TYPE=Debug sh build.sh
编译完成后,产物位于源码目录下的 output/。
如何检查机器是否支持 AVX2 指令集?
cat /proc/cpuinfo | grep avx2
输出非空即代表支持 AVX2。
4. 自行构建开发镜像
如需自定义基础镜像(例如更换基础发行版、增加调试工具),请参考源码中的 docker/README.md。
FAQ
Q1: 镜像版本和 Doris 版本不匹配会怎样?
镜像中的 thirdparty 与 toolchain 与 Doris 源码强耦合。跨版本组合很可能在编译阶段抛出 undefined reference、incompatible library 等链接错误,请严格按表格选择。
Q2: 编译时报 AVX2 not supported?
宿主机或目标运行机 CPU 不支持 AVX2 指令集。改用带 no-avx2 后缀的镜像,并在 build 时设置 USE_AVX2=0。
Q3: docker pull 拉取镜像太慢?
可配置 Docker 镜像加速器,或使用 docker.io/apache/doris:... 完整路径。
Q4: 容器内 Java 库下载失败?
确认容器启动时使用了 --network=host,并将 ~/.m2 目录挂载到容器,避免代理或网络隔离导致 Maven 中央仓库不可达。