Apache Gravitino 1.3.1 Docker Compose 部署指南

使用 Docker Compose 一键部署 Apache Gravitino 1.3.1(Gravitino Server + PostgreSQL 后端),涵盖自构建 JDK 17 镜像、数据库 schema 自动初始化、挂载 entrypoint 启动脚本、JVM 堆 256–512MB 限定、端口映射与 REST/gcli 验证,并给出等价 docker run 方式。部署在 Ubuntu 22.04 + Docker(Compose v2)环境实测通过。

Apache GravitinoApache Gravitino容器化部署Apache大数据Docker Compose2026/10/11

Apache Gravitino 1.3.1 Docker Compose 部署指南

目标:使用 Docker Compose 一键部署 Apache Gravitino 1.3.1(Gravitino Server + PostgreSQL 后端),涵盖自构建 JDK 17 镜像、schema 自动初始化、挂载 entrypoint 启动脚本、JVM 堆内存限定、端口映射与 REST/gcli 验证,并给出等价的 docker run 运行方式。部署流程在 Ubuntu 22.04 + Docker(Compose v2)环境实测通过。

一、环境信息

  • 宿主机操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • Docker 版本:Docker Engine(含 Compose v2 插件)
  • 基础镜像:ubuntu:22.04(自构建 Gravitino 镜像)+ postgres:14(后端)
  • 组件版本:Apache Gravitino 1.3.1
  • 服务名 / 容器名:gravitino / gravitino-server、postgres / gravitino-postgres
  • 网络:compose 项目自定义 bridge 网络 gravitino-net
  • 端口映射:8090(REST/Web)、9001(iceberg-rest aux)、9101(lance-rest aux)、5432(PostgreSQL)
  • 部署目录:/opt/data/ops/gravitino-compose
  • JVM 堆:-Xms256m -Xmx512m -XX:MaxMetaspaceSize=256m

二、镜像选型说明

镜像构建方式版本说明
自构建镜像(本文)ubuntu:22.04 基础 + DockerfileGravitino 1.3.1构建时安装 JDK 17,从官方 dlcdn 下载 1.3.1 发行包并补 PostgreSQL JDBC 驱动
postgres 后端官方 postgres:14 镜像PostgreSQL 14作为 Gravitino 元数据存储后端
自构建 centos 版centos:8 基础 + 同款 Dockerfile(JDK 17 路径换为 /usr/lib/jvm/java-17-openjdk)Gravitino 1.3.1适用于 CentOS-based 宿主机

💡 说明:采用自构建 ubuntu:22.04 + 官方发行包,可精确锁定 1.3.1 版本,规避预构建镜像标签漂移。Gravitino 运行需 JDK 17。

三、前置条件

  • 已安装 Docker Engine 与 Docker Compose 插件:docker --version && docker compose version
  • 宿主机已规划部署目录 /opt/data/ops/gravitino-compose
  • 可访问 dlcdn.apache.org 与 repo1.maven.org(构建阶段下载发行包与 JDBC 驱动)

四、部署步骤

4.1 创建部署目录与文件

mkdir -p /opt/data/ops/gravitino-compose
cd /opt/data/ops/gravitino-compose

目录内含 Dockerfile、gravitino-compose.yml、entrypoint.sh 三份文件。

4.2 编写 Dockerfile

保存为 /opt/data/ops/gravitino-compose/Dockerfile:

FROM ubuntu:22.04
RUN apt-get update && DEBIAN_FRONTEND=noninteractive \
    apt-get install -y openjdk-17-jdk-headless wget tar postgresql-client && \
    rm -rf /var/lib/apt/lists/*
RUN mkdir -p /opt/gravitino && cd /opt/gravitino && \
    wget -q https://dlcdn.apache.org/gravitino/1.3.1/gravitino-1.3.1-bin.tar.gz && \
    tar -xzf gravitino-1.3.1-bin.tar.gz && rm -f gravitino-1.3.1-bin.tar.gz
RUN cd /opt/gravitino/gravitino-1.3.1-bin/libs && \
    wget -q https://repo1.maven.org/maven2/org/postgresql/postgresql/42.7.4/postgresql-42.7.4.jar
ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
ENV GRAVITINO_HOME=/opt/gravitino/gravitino-1.3.1-bin
ENV GRAVITINO_MEM="-Xms256m -Xmx512m -XX:MaxMetaspaceSize=256m"
ENV PATH=$GRAVITINO_HOME/bin:$JAVA_HOME/bin:$PATH
WORKDIR /opt/gd

💡 说明:构建阶段安装 JDK 17(Gravitino 1.2+ 运行需 JDK 17)、下载 1.3.1 发行包解压到 /opt/gravitino/gravitino-1.3.1-bin,并补齐 PostgreSQL JDBC 驱动(发行包 libs/ 只自带 H2 驱动)。

4.3 编写 gravitino-compose.yml

保存为 /opt/data/ops/gravitino-compose/gravitino-compose.yml:

services:
  postgres:
    image: postgres:14
    container_name: gravitino-postgres
    environment:
      POSTGRES_USER: gravitino
      POSTGRES_PASSWORD: gravitino123
      POSTGRES_DB: gravitino
    ports:
      - "5432:5432"
    volumes:
      - ./data/pg:/var/lib/postgresql/data
    networks: [gravitino-net]

  gravitino:
    build: .
    container_name: gravitino-server
    hostname: gravitino
    entrypoint: ["/opt/gd/entrypoint.sh"]
    depends_on: [postgres]
    ports:
      - "8090:8090"   # REST / Web UI
      - "9001:9001"   # iceberg-rest aux
      - "9101:9101"   # lance-rest aux
    volumes:
      - ./entrypoint.sh:/opt/gd/entrypoint.sh:ro
    healthcheck:
      test: ["CMD", "curl", "-fsS", "http://localhost:8090/health"]
      interval: 10s
      timeout: 5s
      retries: 30
networks:
  gravitino-net:
    driver: bridge

💡 说明:gravitino 依赖 postgres 就绪后启动;DB 用户即库 owner(gravitino),schema 由其创建,故表 owner 与连接用户一致,无需额外 GRANT。

4.4 编写 entrypoint.sh

保存为 /opt/data/ops/gravitino-compose/entrypoint.sh,并赋执行权限:

chmod +x /opt/data/ops/gravitino-compose/entrypoint.sh

内容如下:

#!/usr/bin/env bash
set -x
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export GRAVITINO_HOME=/opt/gravitino/gravitino-1.3.1-bin
export GRAVITINO_MEM="-Xms256m -Xmx512m -XX:MaxMetaspaceSize=256m"
export PATH=$GRAVITINO_HOME/bin:$JAVA_HOME/bin:$PATH

# 1) 等待 PostgreSQL 就绪
until PGPASSWORD=gravitino123 pg_isready -h postgres -U gravitino -d gravitino; do
  echo "waiting for postgres ..."
  sleep 2
done

# 2) 将存储后端由 H2 切换为 PostgreSQL
sed -i 's|jdbcUrl = jdbc:h2|jdbcUrl = jdbc:postgresql://postgres:5432/gravitino|' $GRAVITINO_HOME/conf/gravitino.conf
sed -i 's|jdbcDriver = org.h2.Driver|jdbcDriver = org.postgresql.Driver|' $GRAVITINO_HOME/conf/gravitino.conf
sed -i 's|jdbcPassword = gravitino|jdbcPassword = gravitino123|' $GRAVITINO_HOME/conf/gravitino.conf

# 3) 初始化 schema(幂等)
PGPASSWORD=gravitino123 psql -h postgres -U gravitino -d gravitino -v ON_ERROR_STOP=1 \
  -f $GRAVITINO_HOME/scripts/postgresql/schema-1.3.0-postgresql.sql

# 4) 启动 Gravitino Server 并保持前台
$GRAVITINO_HOME/bin/gravitino.sh start
echo "=== gravitino ready, keep alive ==="
tail -f /dev/null

💡 说明:JDBC 后端不自动建表,entrypoint.sh 在启动前显式执行发行包自带的 schema-1.3.0-postgresql.sql(由库 owner 用户执行,避免权限问题)。用挂载脚本启动比内联 sh -c 的引号嵌套更稳妥。

4.5 构建并启动

cd /opt/data/ops/gravitino-compose
docker compose -f gravitino-compose.yml up -d --build

实测回显(典型):

 Image gravitino-compose-gravitino Built
 Network gravitino-compose_gravitino-net Created
 Container gravitino-postgres Created
 Container gravitino-server   Created
 Container gravitino-postgres Started
 Container gravitino-server   Started

查看容器状态:

cd /opt/data/ops/gravitino-compose
docker compose ps

实测回显(典型):

NAME                 IMAGE                          SERVICE    STATUS                        PORTS
gravitino-postgres   postgres:14                    postgres   Up                            0.0.0.0:5432->5432/tcp
gravitino-server     gravitino-compose-gravitino    gravitino  Up (health: starting)         0.0.0.0:8090-8090->8090/tcp, ...

4.6 验证服务(REST / Web)

宿主机访问 REST 接口:

curl -s http://127.0.0.1:8090/api/version
curl -s http://127.0.0.1:8090/health
curl -s -o /dev/null -w 'HTTP %{http_code}\n' http://127.0.0.1:8090/

实测回显:

{"code":0,"version":{"version":"1.3.1","compileDate":"24/09/2026 07:52:42","gitCommit":"ab5d0a4d655e6a81d0b86f7d2733d1874ed3f41a"}}
{"code":0,"status":"up","checks":[{"name":"httpServer","status":"up","details":{}},{"name":"entityStore","status":"up","details":{}}]}
HTTP 200

查看服务启动日志关键行:

cd /opt/data/ops/gravitino-compose
docker compose logs gravitino | grep -iE 'Detected database|port 8090|Done, Gravitino'

实测回显:

Detected database product: postgresql
Gravitino-webserver web server started on host 0.0.0.0 port 8090.
Done, Gravitino server started.

4.7 gcli 建元数据验证

docker exec -it gravitino-server bash \
  -c "export PATH=/opt/gravitino/gravitino-1.3.1-bin/bin:/usr/lib/jvm/java-17-openjdk-amd64/bin:\$PATH; \
  gcli.sh --client"

实测回显:

Apache Gravitino 1.3.1

创建 metalake 与 postgres catalog:

docker exec -it gravitino-server bash \
  -c "export PATH=/opt/gravitino/gravitino-1.3.1-bin/bin:/usr/lib/jvm/java-17-openjdk-amd64/bin:\$PATH; \
  gcli.sh metalake create --metalake demo_metalake --comment 'created from gcli in compose'"
docker exec -it gravitino-server bash \
  -c "export PATH=/opt/gravitino/gravitino-1.3.1-bin/bin:/usr/lib/jvm/java-17-openjdk-amd64/bin:\$PATH; \
  gcli.sh metalake list"

实测回显:

demo_metalake created
demo_metalake

创建对接容器内 PostgreSQL 的 catalog,并列出:

docker exec -it gravitino-server bash \
  -c "export PATH=/opt/gravitino/gravitino-1.3.1-bin/bin:/usr/lib/jvm/java-17-openjdk-amd64/bin:\$PATH; \
  gcli.sh catalog create --metalake demo_metalake --name postgres_cat --provider postgres \
  --properties 'jdbc-url=jdbc:postgresql://postgres:5432/gravitino,jdbc-user=gravitino,jdbc-password=gravitino123,jdbc-database=gravitino,jdbc-driver=org.postgresql.Driver'"
docker exec -it gravitino-server bash \
  -c "export PATH=/opt/gravitino/gravitino-1.3.1-bin/bin:/usr/lib/jvm/java-17-openjdk-amd64/bin:\$PATH; \
  gcli.sh catalog list --metalake demo_metalake"

实测回显:

postgres_cat catalog created
postgres_cat

REST 复核:

curl -s http://127.0.0.1:8090/api/metalakes
curl -s http://127.0.0.1:8090/api/metalakes/demo_metalake/catalogs

实测回显:

{"code":0,"metalakes":[{"name":"demo_metalake","comment":"created from gcli in compose","properties":{"in-use":"true"},"audit":{"creator":"anonymous","createTime":"2026-10-11T12:56:34.334380393Z"}}]}
{"code":0,"identifiers":[{"namespace":["demo_metalake"],"name":"postgres_cat"}]}

4.8 验证 JVM 堆生效与端口

docker exec -it gravitino-server bash \
  -c "export PATH=/usr/lib/jvm/java-17-openjdk-amd64/bin:\$PATH; \
  PID=\$(pgrep -f GravitinoServer | head -1); jcmd \$PID VM.flags | tr ' ' '\n' | grep -iE 'HeapSize|MaxMetaspace'"

实测回显:

-XX:InitialHeapSize=268435456
-XX:MaxHeapSize=536870912
-XX:MaxMetaspaceSize=268435456

宿主机逐一验证映射端口:

curl -s -o /dev/null -w 'port 8090 -> HTTP %{http_code}\n' http://127.0.0.1:8090/
curl -s -o /dev/null -w 'port 9001 -> HTTP %{http_code}\n' http://127.0.0.1:9001/
curl -s -o /dev/null -w 'port 9101 -> HTTP %{http_code}\n' http://127.0.0.1:9101/

实测回显:

port 8090 -> HTTP 200
port 9001 -> HTTP 404
port 9101 -> HTTP 404

五、数据持久化说明

Gravitino 的元数据存于 PostgreSQL 数据卷,日志与运行态存于安装目录。若要持久化,把以下目录挂载回宿主机:

volumes:
  - ./data/pg:/var/lib/postgresql/data
  - ./data/gravitino/logs:/opt/gravitino/gravitino-1.3.1-bin/logs

💡 说明:PostgreSQL 数据卷持久化后,容器重建不丢 metalake/catalog 元数据;日志目录挂载便于直接在宿主机查看 gravitino-server.log。

六、常用环境变量表

本例通过 Dockerfile ENV 与 entrypoint 脚本内的 export 注入,Compose 层也可用 environment: 注入:

环境变量实测值说明
JAVA_HOME/usr/lib/jvm/java-17-openjdk-amd64JDK 17 家目录
GRAVITINO_HOME/opt/gravitino/gravitino-1.3.1-binGravitino 安装根目录
GRAVITINO_MEM-Xms256m -Xmx512m -XX:MaxMetaspaceSize=256mJVM 堆参数(256–512MB)
GRAVITINO_USE_WEB_V2true(默认)启用 Web UI v2
PATH$GRAVITINO_HOME/bin:$JAVA_HOME/bin:$PATH命令搜索路径

七、常用配置参数说明

配置说明
gravitino.entity.store.relational.jdbcUrlJDBC 连接串,容器内为 jdbc:postgresql://postgres:5432/gravitino
gravitino.entity.store.relational.jdbcDriverorg.postgresql.Driver(PostgreSQL 后端)
gravitino.entity.store.relational.jdbcUsergravitino
gravitino.entity.store.relational.jdbcPasswordgravitino123
gravitino.server.webserver.httpPortREST/Web 端口,默认 8090
iceberg-rest aux httpPort9001
lance-rest aux httpPort9101

八、等价 docker run 运行方式

不加 Compose,可用两条 docker run 启同一套服务(先建网络):

docker network create gravitino-net
docker run -d --name gravitino-postgres --network gravitino-net \
  -e POSTGRES_USER=gravitino -e POSTGRES_PASSWORD=gravitino123 -e POSTGRES_DB=gravitino \
  -p 5432:5432 -v /opt/data/ops/gravitino-compose/data/pg:/var/lib/postgresql/data postgres:14
docker run -d --name gravitino-server --network gravitino-net --hostname gravitino \
  -p 8090:8090 -p 9001:9001 -p 9101:9101 \
  -v /opt/data/ops/gravitino-compose/entrypoint.sh:/opt/gd/entrypoint.sh:ro \
  gravitino-compose-gravitino

💡 说明:镜像默认名即 gravitino-compose-gravitino;entrypoint.sh 内已等待 postgres 就绪并初始化 schema。

九、常用运维命令

# 停止并移除容器
cd /opt/data/ops/gravitino-compose
docker compose down

# 重建并后台启动
docker compose up -d --build

# 查看日志(跟踪启动过程)
docker compose logs -f gravitino

# 重启服务
docker compose restart gravitino
# 容器内交互式进入 Gravitino 命令行
docker exec -it gravitino-server bash

十、常见问题(FAQ)

Q1:启动日志报 relation "entity_change_log" does not exist。

JDBC 后端不自动建表。确认 entrypoint.sh 已执行 scripts/postgresql/schema-1.3.0-postgresql.sql。

Q2:日志报 class not found: org.postgresql.Driver。

镜像 libs/ 缺 PostgreSQL 驱动,确认 Dockerfile 已下载 postgresql-42.7.4.jar 到 libs/。

Q3:gravitino 启动时连不上数据库。

depends_on 只保证启动顺序,不保证就绪;entrypoint 中的 pg_isready 轮询即用于等待 PostgreSQL 真正可用,保留该逻辑即可。

Q4:健康检查 /api/health/liveness 返回 404。

1.3.1 健康检查真值路径为 /health(healthcheck 已按此配置);版本接口为 /api/version。

Q5:gcli.sh 提示找不到命令。

需在 docker exec 内显式 export PATH=$GRAVITINO_HOME/bin:$JAVA_HOME/bin:$PATH 后再执行 gcli.sh。

十一、参考链接

  • Apache Gravitino 官方下载:https://dlcdn.apache.org/gravitino/1.3.1/
  • Apache Gravitino 项目主页:https://gravitino.apache.org/