Apache Gobblin 0.17.0 Docker Compose 部署指南
使用 Docker Compose 一条命令部署 Apache Gobblin 0.17.0 standalone 单容器(Eclipse Temurin 8 基础镜像 + 源码构建的约 180MB 发行包),涵盖 Dockerfile、docker-compose.yml、entrypoint 启动脚本、JVM 堆限定 512MB、9000 端口映射与健康检查,并给出等价 docker run 方式与本地文件复制作业验证。部署在 Ubuntu 22.04 + Docker Compose 环境实测通过。
Apache Gobblin 0.17.0 Docker Compose 部署指南
目标:使用 Docker Compose 一键部署 Apache Gobblin 0.17.0 standalone 单容器(Eclipse Temurin 8 基础镜像 + 源码构建出的约 180 MB 发行包),涵盖自定义镜像、
docker-compose.yml、挂载 entrypoint 启动脚本、JVM 堆内存限定、Admin Web UI 9000 端口映射与健康检查,并给出等价的docker run运行方式与「本地文件 → 本地文件」复制作业验证。部署流程在 Ubuntu 22.04 + Docker(Compose v2)环境实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- Docker 版本:Docker Engine(含 Compose v2 插件)
- 基础镜像:
eclipse-temurin:8-jdk(JDK 8,Gobblin 0.17.0 编译/运行目标为 Java 8) - 组件版本:Apache Gobblin 0.17.0
- 容器名称:
gobblin-compose-standalone - 镜像名:
gobblin-standalone:0.17.0 - 端口映射:
9000(Admin Web UI / Jetty) - 部署目录:
/opt/data/ops/gobblin-compose - 发行包来源:由本机源码构建产出的
apache-gobblin-incubating-bin-0.17.0.tar.gz(约 180 MB,解压目录gobblin-dist) - JVM 堆:
-Xmx512m -Xms256m(限定在 256–512MB 区间)
二、镜像选型说明
| 镜像 | 构建方式 | 版本 | 说明 |
|---|---|---|---|
| 自构建镜像(本文) | eclipse-temurin:8-jdk 基础 + Dockerfile | Gobblin 0.17.0 | 构建时把源码构建出的发行包拷入镜像解压部署,与《Ubuntu 22.04 安装 Apache Gobblin 0.17.0 指南》产出一致 |
| 通用 JDK8 镜像 | 预构建 | 需查可用标签 | Gobblin 0.17.0 必须 JDK 8,镜像需自带发行包方可运行 |
| 官方预构建镜像 | 官方 registry | 无 | Gobblin 官方无二进制发行包,也无官方镜像,只能自构建 |
💡 说明:采用
eclipse-temurin:8-jdk+ 本机源码构建的发行包,可精确锁版本 0.17.0,规避预构建镜像标签漂移与官方无二进制的问题。
三、前置条件
- 已安装 Docker Engine 与 Docker Compose 插件:
docker --version && docker compose version - 宿主机已规划部署目录
/opt/data/ops/gobblin-compose - 已按《Ubuntu 22.04 安装 Apache Gobblin 0.17.0 指南》构建出
apache-gobblin-incubating-bin-0.17.0.tar.gz
四、部署步骤
4.1 创建部署目录与文件
mkdir -p /opt/data/ops/gobblin-compose/jobs
cd /opt/data/ops/gobblin-compose
目录内含 Dockerfile、docker-compose.yml、entrypoint.sh、jobs/local-copy.job 与发行包 apache-gobblin-incubating-bin-0.17.0.tar.gz。
4.2 编写 Dockerfile
保存为 /opt/data/ops/gobblin-compose/Dockerfile:
FROM eclipse-temurin:8-jdk
ENV JAVA_HOME=/opt/java/openjdk
ENV GOBBLIN_HOME=/opt/gobblin/gobblin-dist
ENV GOBBLIN_WORK_DIR=/opt/gobblin/work
ENV GOBBLIN_JOB_CONFIG_DIR=/opt/gobblin/jobs
ENV PATH=$GOBBLIN_HOME/bin:$JAVA_HOME/bin:$PATH
COPY apache-gobblin-incubating-bin-0.17.0.tar.gz /opt/gobblin/
RUN set -eux; \
cd /opt/gobblin; \
tar -xzf apache-gobblin-incubating-bin-0.17.0.tar.gz; \
rm -f apache-gobblin-incubating-bin-0.17.0.tar.gz; \
ls -ld /opt/gobblin/gobblin-dist
# 开启 standalone Admin Web UI(Jetty,9000 端口);job history store 保持默认关闭,无需外部数据库
RUN sed -i 's/^job.execinfo.server.enabled=.*/job.execinfo.server.enabled=true/' \
/opt/gobblin/gobblin-dist/conf/standalone/application.conf
# 作业配置目录与本地文件源/目标数据
COPY jobs/local-copy.job /opt/gobblin/jobs/local-copy.job
RUN mkdir -p /opt/gobblin/data/input /opt/gobblin/data/output "$GOBBLIN_WORK_DIR"; \
printf 'hello gobblin\n' > /opt/gobblin/data/input/a.txt; \
printf 'copy demo\n' > /opt/gobblin/data/input/b.txt; \
printf 'compose deploy\n' > /opt/gobblin/data/input/c.txt
COPY entrypoint.sh /opt/gobblin/entrypoint.sh
RUN chmod +x /opt/gobblin/entrypoint.sh
EXPOSE 9000
ENTRYPOINT ["/opt/gobblin/entrypoint.sh"]
💡 说明:构建阶段把源码构建出的发行包拷入镜像并解压到
/opt/gobblin/gobblin-dist;sed将job.execinfo.server.enabled置为true以启动 Admin Web UI,同时保持job.history.store.enabled(默认false)关闭以免报jdbcUrl错误。
4.3 编写 docker-compose.yml
保存为 /opt/data/ops/gobblin-compose/docker-compose.yml:
services:
gobblin:
build: .
image: gobblin-standalone:0.17.0
container_name: gobblin-compose-standalone
hostname: gobblin
ports:
- "9000:9000" # Admin Web UI (Jetty)
healthcheck:
test: ["CMD-SHELL", "bash -c 'exec 3<>/dev/tcp/127.0.0.1/9000'"]
interval: 10s
timeout: 5s
retries: 12
start_period: 40s
⚠️ 注意:健康检查以 TCP 探测 9000 端口(Admin Web UI)判断就绪;
start_period留出 40s 供 Gobblin standalone 启动。
4.4 编写 entrypoint.sh
保存为 /opt/data/ops/gobblin-compose/entrypoint.sh,并赋执行权限:
chmod +x /opt/data/ops/gobblin-compose/entrypoint.sh
内容如下:
#!/usr/bin/env bash
set -x
export JAVA_HOME=/opt/java/openjdk
export GOBBLIN_HOME=/opt/gobblin/gobblin-dist
export GOBBLIN_WORK_DIR=/opt/gobblin/work
export GOBBLIN_JOB_CONFIG_DIR=/opt/gobblin/jobs
export PATH=$GOBBLIN_HOME/bin:$JAVA_HOME/bin:$PATH
mkdir -p "$GOBBLIN_WORK_DIR"
# standalone start 为后台守护启动,JVM 堆限制 512MB(符合 256–512MB 约束)
"$GOBBLIN_HOME/bin/gobblin-standalone.sh" start --jvmopts "-Xmx512m -Xms256m"
# 等待 Admin Web UI 起来
for i in $(seq 1 30); do
if (exec 3<>/dev/tcp/127.0.0.1/9000) 2>/dev/null; then
echo "=== Gobblin Admin Web UI is listening on 9000 ==="; break
fi
sleep 2
done
echo "=== Gobblin standalone started, keep container alive ==="
tail -f /dev/null
💡 说明:使用挂载的 entrypoint 脚本启动 standalone 并保持容器存活;
--jvmopts "-Xmx512m -Xms256m"将 JVM 堆限定在 256–512MB 区间。
4.5 作业配置 local-copy.job
保存为 /opt/data/ops/gobblin-compose/jobs/local-copy.job(本地文件 → 本地文件复制作业):
job.name=LocalFileCopyCompose
job.group=demo
# CopySource:本地文件系统到本地文件系统的复制作业
source.class=org.apache.gobblin.data.management.copy.CopySource
data.publisher.type=org.apache.gobblin.data.management.copy.publisher.CopyDataPublisher
writer.builder.class=org.apache.gobblin.data.management.copy.writer.FileAwareInputStreamDataWriterBuilder
converter.classes=org.apache.gobblin.converter.IdentityConverter
# 数据集发现:匹配输入目录下的所有 .txt
gobblin.dataset.profile.class=org.apache.gobblin.data.management.copy.CopyableGlobDatasetFinder
gobblin.dataset.pattern=/opt/gobblin/data/input/*.txt
# 目标目录与持久化目录
data.publisher.final.dir=/opt/gobblin/data/output
distcp.persist.dir=/opt/gobblin/data/persist
# 简化本地作业:不启用状态存储、跳过回收站、不在任务后清理 staging 数据
state.store.enabled=false
gobblin.trash.skip.trash=true
cleanup.staging.data.per.task=false
job.commit.parallelize=true
⚠️ 注意:作业文件后缀必须为
.job(或.pull),.properties不被加载。
4.6 构建并启动
cd /opt/data/ops/gobblin-compose
docker compose up -d --build
实测回显:
#14 naming to docker.io/library/gobblin-standalone:0.17.0 done
Image gobblin-standalone:0.17.0 Built
Network gobblin-compose_default Created
Container gobblin-compose-standalone Created
Container gobblin-compose-standalone Started
查看容器状态:
docker compose ps
实测回显:
NAME IMAGE SERVICE STATUS PORTS
gobblin-compose-standalone gobblin-standalone:0.17.0 gobblin Up 2 minutes (healthy) 0.0.0.0:9000->9000/tcp, [::]:9000->9000/tcp
4.7 作业与 Web UI 验证
docker exec gobblin-compose-standalone bash -c \
"grep -E 'Loaded [0-9]+ job configurations' /opt/gobblin/gobblin-dist/logs/standalone.out | tail -1"
实测回显:
2026-10-11 14:05:45 UTC INFO [JobScheduler STARTING] JobScheduler 539 - Loaded 1 job configurations
作业执行成功:
docker exec gobblin-compose-standalone bash -c \
"grep -E 'state SUCCESSFUL' /opt/gobblin/gobblin-dist/logs/standalone.out | tail -1"
实测回显:
2026-10-11 14:05:48 UTC INFO [Commit-thread-0] SafeDatasetCommit 123 - Committing dataset ... job_LocalFileCopyCompose_1791727545874 with commit policy COMMIT_ON_FULL_SUCCESS and state SUCCESSFUL
输出校验与 Web UI 标题:
docker exec gobblin-compose-standalone bash -c \
"diff -r /opt/gobblin/data/input /opt/gobblin/data/output && echo IDENTICAL"
docker exec gobblin-compose-standalone bash -c \
"wget -qO- http://127.0.0.1:9000/ 2>/dev/null | grep -o '<title>.*</title>' | head -1"
实测回显:
IDENTICAL
<title>Gobblin Admin</title>
宿主机映射端口访问:
wget -qO- http://127.0.0.1:9000/ | grep -o '<title>.*</title>'
实测回显:
<title>Gobblin Admin</title>
4.8 验证 JVM 堆生效
docker exec gobblin-compose-standalone bash -c "jps -v | grep SchedulerDaemon"
实测回显(-Xmx512m 位于尾部,为最终生效值,MaxHeapSize = 512.0MB):
<pid> SchedulerDaemon -Xmx1g -Xms512m -Xmx512m -Dlog4j.configuration=file:///opt/gobblin/gobblin-dist/conf/standalone/log4j.xml -Dgobblin.logs.dir=/opt/gobblin/gobblin-dist/logs
五、数据持久化说明
Gobblin 的状态存储、任务 staging、发布输出与日志默认存于容器内目录(/opt/gobblin/work、/opt/gobblin/data、/opt/gobblin/gobblin-dist/logs)。若要持久化,可把宿主机的目录挂载回容器,例如在 docker-compose.yml 的 services.gobblin 下追加:
volumes:
- ./data:/opt/gobblin/data
- ./work:/opt/gobblin/work
- ./logs:/opt/gobblin/gobblin-dist/logs
💡 说明:将
/opt/gobblin/data(源/目标数据)、/opt/gobblin/work(状态存储与 staging)挂载为宿主机目录,容器重建后数据得以保留。
六、常用环境变量表
本例通过 entrypoint 脚本内的 export 注入环境,Compose 层也可用 environment: 注入:
| 环境变量 | 实测值 | 说明 |
|---|---|---|
JAVA_HOME | /opt/java/openjdk | JDK 8 家目录(Temurin 镜像内置) |
GOBBLIN_HOME | /opt/gobblin/gobblin-dist | Gobblin 安装根目录 |
GOBBLIN_WORK_DIR | /opt/gobblin/work | 状态存储 / staging 工作目录 |
GOBBLIN_JOB_CONFIG_DIR | /opt/gobblin/jobs | 作业配置监测目录 |
PATH | $GOBBLIN_HOME/bin:$JAVA_HOME/bin:$PATH | 命令搜索路径 |
| JVM 堆 | -Xmx512m -Xms256m | 通过 --jvmopts 透传 |
七、常用配置参数说明
| 配置 | 说明 |
|---|---|
job.execinfo.server.enabled=true | 启动 Admin Web UI(9000) |
admin.server.enabled=true / admin.server.port=9000 | Admin Web Server 开关与端口 |
job.history.store.enabled=false | 作业历史库保持关闭(开启需 JDBC) |
jobconf.dir=${env:GOBBLIN_JOB_CONFIG_DIR} | 作业配置监测目录 |
jobconf.monitor.interval=30000 | 作业目录扫描间隔(ms) |
--jvmopts "-Xmx512m -Xms256m" | 指定 JVM 堆参数 |
更多参数见《Apache Gobblin 0.17.0 配置参数详解》。
八、等价 docker run 运行方式
不加 Compose,可用单条 docker run 启动同一 standalone:
docker run -d --name gobblin-compose-standalone --hostname gobblin \
-p 9000:9000 \
-e JAVA_HOME=/opt/java/openjdk \
-e GOBBLIN_HOME=/opt/gobblin/gobblin-dist \
-e GOBBLIN_WORK_DIR=/opt/gobblin/work \
-e GOBBLIN_JOB_CONFIG_DIR=/opt/gobblin/jobs \
gobblin-standalone:0.17.0
💡 说明:镜像名即为 Compose 构建产物
gobblin-standalone:0.17.0;容器启动后由 entrypoint 拉起 standalone 并监听 9000。
九、常用运维命令
# 停止并移除容器
cd /opt/data/ops/gobblin-compose
docker compose down
# 重建并后台启动
docker compose up -d --build
# 查看日志(跟踪 standalone 启动过程)
docker compose logs -f gobblin
# 重启服务
docker compose restart gobblin
十、常见问题(FAQ)
Q1:容器状态长时间 health: starting 或 unhealthy。
standalone 启动较慢,确认 9000 端口已监听;必要时上调 start_period 与 retries。
Q2:wget http://127.0.0.1:9000/ 连接被拒。
确认 job.execinfo.server.enabled=true(Dockerfile 已用 sed 置位),且 9000 已映射到宿主机。
Q3:作业日志显示 Loaded 0 job configurations。
作业文件后缀必须是 .job(或 .pull),.properties 不被加载。
Q4:开启 job.history.store.enabled=true 后容器反复重启并报 jdbcUrl is required with driverClassName。
作业历史库需外部 JDBC 数据库,standalone 保持 job.history.store.enabled=false(默认)。
十一、参考链接
- Apache Gobblin 官方归档:
https://archive.apache.org/dist/gobblin/apache-gobblin-0.17.0/ - Apache Gobblin 项目主页:
https://gobblin.apache.org/ - Eclipse Temurin 镜像:
https://hub.docker.com/_/eclipse-temurin
系列其他文档:《Ubuntu 22.04 安装 Apache Gobblin 0.17.0 指南》《CentOS 8 安装 Apache Gobblin 0.17.0 指南》《Apache Gobblin 0.17.0 配置参数详解》《Apache Gobblin 0.17.0 常用 CLI 命令与工具详解》。