Apache Tika 4.1.0 Docker Compose 部署指南
使用官方 apache/tika 镜像以 Docker Compose 部署 Apache Tika 4.1.0 的完整指南,涵盖镜像元数据核验、配置挂载持久化、堆内存环境变量、等价 docker run 与常用运维命令,步骤均实测。
Apache Tika 4.1.0 Docker Compose 部署指南
一、环境信息
| 项目 | 值 |
|---|---|
| Docker Engine | 29.8.0 |
| Docker Compose | v5.5.1(docker compose 插件) |
| 镜像 | apache/tika:latest(实测 TIKA_VERSION=4.1.0) |
| 部署目录 | /opt/tika-compose |
| 宿主机端口 | 9998 |
| JVM 堆 | -Xms256m -Xmx512m |
| 执行账号 | root |
二、镜像选型说明
- 官方镜像 apache/tika 即打包完成的 tika-server-standard,无需自行构建。实测 latest 标签对应版本 4.1.0(官方下载页当前最新稳定版一致)。
- 拉取后先核验镜像元数据:
docker images --format '{{.Repository}}:{{.Tag}} {{.Size}}' apache/tika
apache/tika:latest 636MB
docker inspect apache/tika:latest --format '{{json .Config.Env}}'
["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","TIKA_VERSION=4.1.0"]
docker inspect apache/tika:latest --format '{{json .Config.Entrypoint}}'
["/bin/sh","-c","exec java -cp \"/opt/tika-server/*:/opt/tika-server/lib/*:/tika-extras/*\" org.apache.tika.server.core.TikaServerCli -h 0.0.0.0 $0 $@"]
docker inspect apache/tika:latest --format '{{json .Config.Cmd}}'
null
docker inspect apache/tika:latest --format '{{json .Config.ExposedPorts}}'
{"9998/tcp":{}}
- 关键结论:镜像内置 TIKA_VERSION=4.1.0 与 OpenJDK 25.0.4.1;Entrypoint 已固定监听 -h 0.0.0.0,并把 $0 与 $@ 透传给 java 进程,因此 compose 的 command 里追加的 --port、--config 等参数会原样传给 Tika;镜像未定义默认 CMD;仅声明 9998/tcp 一个端口;镜像体积 636MB。
- 内置 JDK 为 25 而非 17:Tika 4.1.0 对此完全兼容,实测容器服务正常,无需额外处理。
三、前置条件
- 已安装 Docker Engine 与 docker compose 插件,验证命令:
docker compose version
Docker Compose version v5.5.1
- 磁盘剩余空间不低于 2GB(镜像约 636MB,运行期临时文件另需空间)。
- 宿主机 9998 端口未被占用,如被占用见十一、Q1。
- 主机可访问 Docker Hub。无法直连的离线环境,可先在能联网的主机执行 docker save apache/tika:latest -o tika-image.tar 导出,拷贝到目标主机后执行 docker load -i tika-image.tar 导入(实测该方式可行)。
四、部署步骤
4.1 创建部署目录与配置文件
mkdir -p /opt/tika-compose && cd /opt/tika-compose
创建 tika-config.json(Tika 4.x 新版 JSON 格式,server 块必填,parsers 使用 kebab-case 注册名):
{
"server": { "host": "0.0.0.0", "port": 9998 },
"parsers": ["pdf-parser", "txt-parser", "image-parser"]
}
4.2 编写 docker-compose.yml
services:
tika:
image: apache/tika:latest
container_name: tika-server
restart: unless-stopped
ports:
- "9998:9998"
environment:
JDK_JAVA_OPTIONS: "-Xms256m -Xmx512m"
volumes:
- ./tika-config.json:/opt/tika-config.json:ro
command: ["--config", "/opt/tika-config.json"]
4.3 启动服务
docker compose up -d
Network tika-compose_default Creating
Network tika-compose_default Creating
Network tika-compose_default Created
Network tika-compose_default Created
Container tika-server Creating
Container tika-server Created
Container tika-server Starting
Container tika-server Started
4.4 验证部署
查看容器状态:
docker compose ps
NAME STATUS PORTS
tika-server Up 0.0.0.0:9998->9998/tcp, [::]:9998->9998/tcp
查看启动日志(确认 JVM 参数拾取与配置加载):
docker compose logs tika | head -10
tika-server | NOTE: Picked up JDK_JAVA_OPTIONS: -Xms256m -Xmx512m
tika-server | INFO [main] org.apache.tika.server.core.TikaServerProcess Starting Apache Tika 4.1.0 server
tika-server | INFO [main] org.apache.tika.config.loader.TikaLoader temporary files go to java.io.tmpdir=/tmp
tika-server | INFO [main] org.apache.tika.server.core.TikaServerProcess Using custom config: /opt/tika-config.json
tika-server | INFO [main] org.apache.tika.server.core.TikaServerProcess Created input temp directory: /tmp/tika-server-input-1869306887621360482
tika-server | INFO [main] org.apache.tika.server.core.TikaServerProcess Created unpack temp directory: /tmp/tika-server-unpack-3806655155458640400
tika-server | INFO [main] org.apache.tika.server.core.TikaServerProcess Configuring __tika-server with basePath=/tmp/tika-server-input-1869306887621360482
tika-server | INFO [main] org.apache.tika.server.core.TikaServerProcess Configuring __unpack with basePath=/tmp/tika-server-unpack-3806655155458640400
tika-server | INFO [main] org.apache.tika.pipes.core.PipesParser Using per-client server mode with 4 clients
tika-server | INFO [main] org.apache.tika.pipes.core.PerClientServerManager pipes-cpu-sizing: hostCores=12, numClients=4, parentReserved=2, autoCap=slice=2, heap=MaxRAMPercentage=18
在宿主机验证服务接口:
curl -s http://127.0.0.1:9998/tika
This is Tika Server (Apache Tika 4.1.0). Please PUT
curl -s -X PUT --data-binary 'demo content' -H 'Content-Disposition: attachment; filename=demo.md' http://127.0.0.1:9998/detect
text/markdown
五、数据持久化说明
- Tika 是无状态的解析服务:不在本地存储任何业务数据,解析临时文件位于容器内 /tmp(日志中的 Created input temp directory 行即为临时目录路径),容器销毁重建不产生数据丢失问题。
- 需要持久化的只有配置文件:通过 bind mount 将宿主机 /opt/tika-compose/tika-config.json 只读挂载到容器内 /opt/tika-config.json,见第八节。
- 日志不落盘,统一通过 docker logs 或 docker compose logs 查看,需要长期留存时可在宿主机配置日志采集。
- 容器内的解析子进程由 Tika 自行管理(空闲超时自动回收、按需重建),无需数据卷参与。
六、常用环境变量表
| 环境变量 | 作用 | 本文取值 | 实测结果 |
|---|---|---|---|
| JDK_JAVA_OPTIONS | JVM 启动参数,java 进程启动时自动拾取 | "-Xms256m -Xmx512m" | 生效,日志输出 NOTE: Picked up JDK_JAVA_OPTIONS: -Xms256m -Xmx512m |
说明:镜像自身的 Env 仅包含 PATH 与 TIKA_VERSION(见第二节核验回显),官方未提供其他业务开关环境变量;宿主机端口映射、重启策略等通过 compose 字段控制,不走环境变量。
七、常用配置参数说明
| compose 字段 | 本文取值 | 说明 |
|---|---|---|
| image | apache/tika:latest | 官方镜像,latest 实测对应 4.1.0 |
| container_name | tika-server | 固定容器名,便于 logs 与 stats 定位 |
| restart | unless-stopped | 异常退出自动拉起,手工停止后不自动重启 |
| ports | "9998:9998" | 宿主机端口:容器端口,容器端口固定 9998 |
| environment | JDK_JAVA_OPTIONS | 控制堆内存,镜像 Entrypoint 中的 java 会自动拾取 |
| volumes | ./tika-config.json:/opt/tika-config.json:ro | 配置文件只读挂载 |
| command | ["--config", "/opt/tika-config.json"] | 透传给 Tika 的追加参数,会拼接到镜像 Entrypoint 之后 |
容器内同样启用 pipes 架构:日志显示 Using per-client server mode with 4 clients,即主进程外还有 4 个解析子进程,内存评估需按多进程合计(见十一、Q4)。
八、配置文件持久化
- 配置文件放宿主机 /opt/tika-compose/tika-config.json,以只读方式挂载进容器,修改配置只需编辑宿主机文件。
- 生效判据:启动日志出现 Using custom config: /opt/tika-config.json,说明配置加载成功。
- 修改配置后的生效流程:
docker compose restart tika
随后复查日志中的 Using custom config 行确认新配置被读取。
九、等价 docker run 运行方式
不使用 compose 时,以下单条命令与上述部署等价(映射宿主机 19998 端口仅为与 compose 实例区分):
docker run -d --name tika-run --restart unless-stopped -p 19998:9998 -e JDK_JAVA_OPTIONS='-Xms256m -Xmx512m' apache/tika:latest --port 9998
启动日志实测回显:
NOTE: Picked up JDK_JAVA_OPTIONS: -Xms256m -Xmx512m
INFO [main] org.apache.tika.server.core.TikaServerProcess Starting Apache Tika 4.1.0 server
INFO [main] org.apache.tika.config.loader.TikaLoader temporary files go to java.io.tmpdir=/tmp
INFO [main] org.apache.tika.server.core.TikaServerProcess Created input temp directory: /tmp/tika-server-input-17144704449811102408
INFO [main] org.apache.tika.server.core.TikaServerProcess Created unpack temp directory: /tmp/tika-server-unpack-16188526666345826698
INFO [main] org.apache.tika.server.core.TikaServerProcess Configuring __tika-server with basePath=/tmp/tika-server-input-17144704449811102408
INFO [main] org.apache.tika.pipes.core.PipesParser Using per-client server mode with 4 clients
在宿主机验证:
curl -s http://127.0.0.1:19998/version
Apache Tika 4.1.0
注意:镜像内没有 wget 与 curl(实测进入容器执行 wget 报 executable file not found),接口验证一律在宿主机执行。确认无误后按需清理该容器:
docker rm -f tika-run
十、常用运维命令
以下命令均在 /opt/tika-compose 目录执行,逐条单独运行。
查看容器状态:
docker compose ps
持续跟踪日志:
docker compose logs -f tika
重启服务(配置变更后使用):
docker compose restart tika
停止与启动:
docker compose stop tika
docker compose start tika
销毁整套服务(容器与内部网络一并移除,配置文件保留在宿主机):
docker compose down
Container tika-server Stopping
Container tika-server Stopped
Container tika-server Removing
Container tika-server Removed
Network tika-compose_default Removing
Network tika-compose_default Removed
查看实时资源占用:
docker stats --no-stream
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
e08e6d996584 tika-run 0.02% 311.4MiB / 31.3GiB 0.97% 2.18kB / 644B 0B / 4.1kB 38
43f8220ccd56 tika-server 196.39% 403.8MiB / 31.3GiB 1.26% 2.25kB / 772B 0B / 4.1kB 61
核验镜像版本:
docker inspect apache/tika:latest --format '{{json .Config.Env}}'
十一、常见问题
Q1:9998 端口被占用无法启动? 将 ports 改为其他宿主机端口,如 "19998:9998",客户端改用新端口访问;或先用 ss -ltnp 排查占用 9998 的进程后再决定是否调整。
Q2:堆内存参数没有生效? 查看 docker compose logs tika,确认存在 NOTE: Picked up JDK_JAVA_OPTIONS 行。若缺失,检查 compose 的 environment 段缩进与写法,修改后执行 docker compose up -d 重建容器。
Q3:配置文件没有生效? 日志出现 Using custom config: /opt/tika-config.json 才表示加载成功。确认 volumes 与 command 两段成对出现且路径一致;只改了宿主机文件时必须执行 docker compose restart tika。
Q4:内存占用数百 MB 是否正常? 正常。容器内是主进程加 4 个 pipes 解析子进程的多进程结构,实测空闲时内存约 311 至 404MiB 之间波动,解析高峰会进一步上升。512MB 堆配置建议容器内存预算不低于 1GB;调小 JDK_JAVA_OPTIONS 的 -Xmx 可降低占用,但需同步评估文档解析余量。
Q5:docker pull 拉取镜像失败? 多为网络不通或 Docker Hub 访问受限。可为 Docker 配置镜像加速或代理;完全离线的环境使用第三节第 4 条的 docker save 与 docker load 方式离线导入。
Q6:日志频繁出现 socket timeout while waiting for task, shutting down? 这是 pipes 解析子进程空闲超时后的自动回收,随后按需重建,属 4.x 正常行为,无需处理。
十二、参考链接
- Docker Hub 镜像主页:https://hub.docker.com/r/apache/tika
- Apache Tika 官方下载页:https://tika.apache.org/download.html
- Tika Server 官方文档:https://cwiki.apache.org/confluence/display/TIKA/TikaServer
- Docker Compose 官方文档:https://docs.docker.com/compose/