Apache Jackrabbit Docker Compose 部署指南
使用 Docker Compose 一键部署 Apache Jackrabbit 2.22.5 standalone,基于 eclipse-temurin 17 镜像运行官方 jar,配置端口、数据与配置卷持久化、JVM 堆内存限制与常用运维命令。
Apache Jackrabbit Docker Compose 部署指南
目标:用 Docker Compose 将 Apache Jackrabbit 2.22.5(standalone 可执行 jar)容器化一键部署,包含镜像制作、端口映射、数据/配置卷持久化、JVM 堆限制与常用运维命令。Compose 部署属于容器场景,本章允许出现 docker / 容器 / 镜像 等词。
一、环境信息
- 镜像基础:
eclipse-temurin:17-jre(OpenJDK 17 JRE,官方镜像) - 应用:Apache Jackrabbit
2.22.5(jackrabbit-standalone-2.22.5.jar) - 版本说明:本方案使用经典 Jackrabbit 2.x standalone(非 Oak)。
- 容器内 JAVA_HOME:
/opt/java/openjdk(eclipse-temurin 官方默认) - 服务端口:容器内
8080,映射宿主8080 - 数据卷目录:
jackrabbit-data:/opt/data/jackrabbit - 配置卷目录:
./conf:/opt/apache-jackrabbit/conf - WebDAV / davE 端点:
/repository/*、/server/*
二、镜像选型说明
| 选项 | 说明 | 是否推荐 |
|---|---|---|
自建镜像(eclipse-temurin:17-jre + 官方 jar COPY) | 可控、安全、贴合官方发行版 | ✅ 推荐 |
| 社区现成 Jackrabbit 镜像 | 官方不维护 Docker 镜像,社区镜像版本滞后、不透明 | 慎用 |
| Apache Jackrabbit Oak 镜像 | 本文是经典 Jackrabbit,与 Oak 无关,勿混用 | 不适用 |
Jackrabbit 官方不发布 Docker 镜像,故采用「官方 JDK 镜像 + COPY 官方 jar」的方式自建,保证拿到纯净的 Apache 发行 jar。
三、前置条件
- 一台已安装 Docker Engine(含 Docker Compose v2 插件)的 Linux 服务器。查看版本:
docker --version
docker compose version
- 具备拉取公共镜像与外网权限(需下载 jar 与
eclipse-temurin:17-jre)。 - 端口
8080未被占用:
ss -lntp | grep 8080 || echo "8080 空闲"
四、部署步骤
4.1 目录规划
mkdir -p /opt/jackrabbit/{conf,data}
cd /opt/jackrabbit
conf/ 放 repository.xml,data/ 作宿主侧数据挂载目录。
4.2 准备仓库配置(选用文件持久化)
与《Ubuntu 22.04 安装 Apache Jackrabbit 2.22.5 指南》一致,把默认 Derby 持久化改为 BundleFsPersistenceManager(standalone 未内嵌 Derby 驱动)。直接下载官方 jars 中的默认配置并改写:
cd /opt/jackrabbit
curl -fsSL -o jackrabbit-standalone-2.22.5.jar \
https://downloads.apache.org/jackrabbit/2.22.5/jackrabbit-standalone-2.22.5.jar
unzip -o jackrabbit-standalone-2.22.5.jar \
org/apache/jackrabbit/core/repository.xml -d conf/ 2>/dev/null
mv conf/org/apache/jackrabbit/core/repository.xml conf/repository.xml
rm -rf conf/org
cp conf/repository.xml conf/repository-fs.xml
sed -i \
's|org.apache.jackrabbit.core.persistence.pool.DerbyPersistenceManager|org.apache.jackrabbit.core.persistence.bundle.BundleFsPersistenceManager|g' \
conf/repository-fs.xml
sed -i '/<param name="url" value="jdbc:derby:/d' conf/repository-fs.xml
sed -i '/<param name="schemaObjectPrefix" value=/d' conf/repository-fs.xml
4.3 Dockerfile
在 /opt/jackrabbit 下创建 Dockerfile:
FROM eclipse-temurin:17-jre
LABEL org.opencontainers.image.title="Apache Jackrabbit 2.22.5 standalone"
LABEL org.opencontainers.image.description="Apache Jackrabbit JCR content repository standalone"
ENV JAVA_HOME=/opt/java/openjdk \
JR_JAR=/opt/apache-jackrabbit/jackrabbit-standalone-2.22.5.jar \
JAVA_TOOL_OPTIONS=-Xms256m\ -Xmx512m\ -Xmn128m
RUN mkdir -p /opt/apache-jackrabbit /opt/data/jackrabbit
WORKDIR /opt/apache-jackrabbit
COPY jackrabbit-standalone-2.22.5.jar /opt/apache-jackrabbit/
EXPOSE 8080
VOLUME ["/opt/data/jackrabbit", "/opt/apache-jackrabbit/conf"]
ENTRYPOINT ["java"]
CMD ["-jar", "/opt/apache-jackrabbit/jackrabbit-standalone-2.22.5.jar", \
"-c", "/opt/apache-jackrabbit/conf/repository-fs.xml", \
"-r", "/opt/data/jackrabbit"]
💡
JAVA_TOOL_OPTIONS=-Xms256m\ -Xmx512m\ -Xmn128m会在 JVM 启动时自动追加堆参数(-Xms256m初始堆、-Xmx512m最大堆、-Xmn128m新生代)。也可改用-JAVA_OPTS+ 脚本读取的方式,此处用官方标准的JAVA_TOOL_OPTIONS最省心。
4.4 docker-compose.yml
在 /opt/jackrabbit 下创建 docker-compose.yml:
services:
jackrabbit:
build: .
image: jackrabbit:2.22.5
container_name: jackrabbit
restart: unless-stopped
ports:
- "8080:8080"
volumes:
# 数据持久化:仓库内容保留到宿主卷,重建容器不丢
- jackrabbit-data:/opt/data/jackrabbit
# 配置持久化:repository*.xml 从宿主 conf 挂载
- ./conf:/opt/apache-jackrabbit/conf
environment:
# 兜底 double-confirm JVM 堆限制(每行一个变量)
JAVA_TOOL_OPTIONS: -Xms256m -Xmx512m -Xmn128m
volumes:
jackrabbit-data:
4.5 构建与启动
cd /opt/jackrabbit
docker compose up -d --build
启动后确认状态与端口:
docker compose ps
预期输出示例(NAME 列 jackrabbit,STATUS Up,PORTS 列 0.0.0.0:8080->8080/tcp)。
查看启动日志(应看到 Apache Jackrabbit is now running at http://localhost:8080/):
docker compose logs -f jackrabbit
预期日志节选:
Using repository directory /opt/data/jackrabbit
Writing log messages to /opt/data/jackrabbit/log
Welcome to Apache Jackrabbit!
-------------------------------
Starting the server...
Apache Jackrabbit is now running at http://localhost:8080/
4.6 验证服务
# workspace 概览(davE 端点)
curl -s -u admin:q1w2e3r4 http://localhost:8080/server/
# WebDAV 创建集合
curl -i -X MKCOL -u admin:q1w2e3r4 http://localhost:8080/repository/default/mydocs
# 写入文本资源
curl -i -X PUT -u admin:q1w2e3r4 -H "Content-Type: text/plain" \
--data "Hello Jackrabbit!" \
http://localhost:8080/repository/default/mydocs/hello.txt
# 读回
curl -s -u admin:q1w2e3r4 http://localhost:8080/repository/default/mydocs/hello.txt
MKCOL 返回 HTTP/1.1 201 Created、PUT 返回 201 Created、GET 返回 Hello Jackrabbit!,即部署成功。
五、数据持久化说明
- 仓库内容(节点、属性、版本、workspace、安全用户表)全部落在容器内
/opt/data/jackrabbit,通过命名卷jackrabbit-data持久化到宿主。docker compose down不删卷,内容保留;docker compose down -v才会删除。 - 换个方式,也可用 bind mount 挂到宿主显式目录(可读性更好,便于
jps -v/tar备份):
volumes:
- /opt/jackrabbit/data:/opt/data/jackrabbit
- 二进制数据与版本目录:
/opt/data/jackrabbit/workspaces/<ws>/db(BundleFs 存储)/opt/data/jackrabbit/repository/version/tmp/log- 日志在
/opt/data/jackrabbit/log/jackrabbit.log与access.log.<日期>。
六、常用环境变量表
| 环境变量 | 作用 | 默认/示例 |
|---|---|---|
JAVA_TOOL_OPTIONS | 注入 JVM 启动参数(含堆限制) | -Xms256m -Xmx512m -Xmn128m |
JAVA_HOME | JDK 路径(eclipse-temurin 已内置) | /opt/java/openjdk |
JR_JAR | standalone jar 绝对路径(供调试参考) | /opt/apache-jackrabbit/jackrabbit-standalone-2.22.5.jar |
TZ | 时区 | Asia/Shanghai(可选) |
七、常用配置参数说明(command)
服务启动命令为镜像 CMD/ENTRYPOINT 拼接结果,等价于:
java -jar /opt/apache-jackrabbit/jackrabbit-standalone-2.22.5.jar \
-c /opt/apache-jackrabbit/conf/repository-fs.xml \
-r /opt/data/jackrabbit
| 参数 | 含义 | 取值示例 |
|---|---|---|
-c,--conf | 仓库配置文件 | repository-fs.xml |
-r,--repo | 仓库数据目录 | /opt/data/jackrabbit |
-p,--port | HTTP 端口 | 8080(默认) |
-h,--host | 绑定地址 | 0.0.0.0 |
-d,--debug | 开启 debug 日志 | 布尔开关 |
-q,--quiet | 关闭控制台输出 | 布尔开关 |
如需改端口,在 compose 里同时改 command: 与 ports: 即可:
command:
- "-jar"
- "/opt/apache-jackrabbit/jackrabbit-standalone-2.22.5.jar"
- "-c"
- "/opt/apache-jackrabbit/conf/repository-fs.xml"
- "-r"
- "/opt/data/jackrabbit"
- "-p"
- "8090"
八、配置文件持久化(conf 挂载)
- 通过
./conf:/opt/apache-jackrabbit/conf把宿主的repository.xml/repository-fs.xml挂进容器。 - 修改宿主侧
conf/repository-fs.xml后重启容器生效:
docker compose restart jackrabbit
- 同一份配置可直接复用到《Ubuntu 22.04 安装指南》的真机部署,实现「一处配置、真机/容器通用」。
九、等价 docker run 运行方式
不喜欢 compose 时,等价命令:
docker run -d --name jackrabbit \
--restart unless-stopped \
-p 8080:8080 \
-e JAVA_TOOL_OPTIONS="-Xms256m -Xmx512m -Xmn128m" \
-v jackrabbit-data:/opt/data/jackrabbit \
-v /opt/jackrabbit/conf:/opt/apache-jackrabbit/conf \
jackrabbit:2.22.5
十、常用运维命令
# 查看进程与 JVM 生效堆(进容器查)
docker exec jackrabbit jps -v
# 预期可见 -Xms256m -Xmx512m -Xmn128m
# real example: 4697 jackrabbit-standalone-2.22.5.jar -Xms256m -Xmx512m -Xmn128m
# 实时日志
docker compose logs -f jackrabbit
# 进入容器 shell
docker exec -it jackrabbit bash
# 重启 / 停止 / 重建
docker compose restart jackrabbit
docker compose stop jackrabbit
docker compose up -d --build
# 查看数据落盘
docker exec jackrabbit ls /opt/data/jackrabbit/workspaces
十一、常见问题(FAQ)
Q1:容器启动即退出,日志报 Could not load JDBC driver class org.apache.derby.jdbc.EmbeddedDriver?
配置仍用 Derby 持久化。按「四、4.2」改为 BundleFsPersistenceManager 并重挂 repository-fs.xml。
Q2:修改配置后不生效?
repository.xml 通过挂载进容器,改宿主侧文件后必须 docker compose restart jackrabbit。
Q3:docker compose down 后数据丢?
若用 down -v 会删命名卷。仅 down 保留数据;要长期留存请一次性用 bind mount 或注释删除卷。
Q4:JVM 堆没按期望生效?
在容器内 docker exec jackrabbit jps -v 复核;确认 JAVA_TOOL_OPTIONS 写对(注意 -Xmx512m 没有空格隔断)。极端情况下若宿主机 JVM 开启 -XX:+UseContainerSupport,请核对容器 cgroup 内存与 -Xmx 二者取小者。
Q5:访问 / 返回 503?
正常,standalone 无根欢迎页;管理入口为 /server/(workspace 概览)与 /repository/(WebDAV)。
十二、参考链接
- Apache Jackrabbit 官网:https://jackrabbit.apache.org/
- Jackrabbit 下载目录:https://downloads.apache.org/jackrabbit/
- eclipse-temurin 官方镜像:https://hub.docker.com/_/eclipse-temurin
- Docker Compose 文档:https://docs.docker.com/compose/