Apache Jackrabbit Docker Compose 部署指南

使用 Docker Compose 一键部署 Apache Jackrabbit 2.22.5 standalone,基于 eclipse-temurin 17 镜像运行官方 jar,配置端口、数据与配置卷持久化、JVM 堆内存限制与常用运维命令。

Apache JackrabbitApache Jackrabbit数据库容器化部署ApacheDocker Compose2026/10/11

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_HOMEJDK 路径(eclipse-temurin 已内置)/opt/java/openjdk
JR_JARstandalone 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,--portHTTP 端口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)。

十二、参考链接