Apache Sling Docker Compose 部署指南

使用 Docker Compose 一键编排自建 Sling 运行镜像,讲清基础镜像选型、构建流程、端口映射与数据目录持久化,堆内存限定并核验生效,覆盖启动验证、内容读写、密码修改与重启后数据保留,另附等价单命令运行、常用运维命令与常见问题,回显均实测

Apache SlingApache Sling2026/10/12

Apache Sling Docker Compose 部署指南

目标:使用 Docker Compose 编排 Apache Sling 9(launchpad standalone jar),通过自建镜像把 Sling 与 Java 8 运行时打进同一镜像,实现「一条 docker compose 命令拉起 Sling」;端口映射到宿主机、sling home 目录持久化、JVM 堆限定 256-512MB。全程命令与回显均为实际执行结果。

一、环境信息

  • Docker:宿主机已安装 Docker(含 docker compose 子命令)
  • Docker Compose:v5.5.1(docker compose version 实测输出 Docker Compose version v5.5.1)
  • 基础镜像:eclipse-temurin:8-jre(内含 Java 8 运行时)
  • 自建镜像:sling:launchpad9(内嵌 org.apache.sling.launchpad-9.jar,102,350,955 字节)
  • 服务名:sling;container_name:sling-launchpad9
  • 映射端口:宿主机 18080 → 镜像内 8080
  • 数据目录:./sling-data → /opt/sling/sling(sling home)
  • Sling 默认管理账号:admin,首次默认口令 admin

💡 实测环境宿主机 8080 已被占用,故映射到 18080;若宿主机 8080 空闲可改回 "8080:8080"。

二、镜像选型说明

镜像说明
eclipse-temurin:8-jre(本指南采用)Eclipse Temurin 官方 Java 8 JRE;Sling 9 launchpad 实测必须 Java 8,Java 11 上核心 bundle 无法解析
openjdk:8-jre-slim旧常用选择,但 openjdk 官方镜像已弃用,实测 docker pull 返回 denied,不建议再选
apache/sling 相关第三方镜像社区维护、版本更新滞后,且不易控制 JVM 参数,本指南不采用

选型结论:以 eclipse-temurin:8-jre 为基础、把 launchpad standalone jar COPY 进镜像自建 sling:launchpad9,离线可运行、参数可控、重建方便。

三、前置条件

  • 装有 Docker 与 Docker Compose v2+ 的服务器,root 权限。
  • 能访问 Docker Hub(拉取 eclipse-temurin:8-jre)与 Apache 归档站(获取 launchpad jar)。
  • 准备好 launchpad standalone jar:按《Apache Sling 安装指南》4.2 节从 https://archive.apache.org/dist/sling/org.apache.sling.launchpad-9.jar 下载(sha256 为 851b38b6ce988795cbc04ffada570e17cf23d3c17ddfa6ad004283f1f7f3b68d)。

四、部署步骤

4.1 创建目录结构并放入 jar

mkdir -p /opt/sling-compose && cd /opt/sling-compose
curl -sL -o org.apache.sling.launchpad-9.jar \
  https://archive.apache.org/dist/sling/org.apache.sling.launchpad-9.jar
ls -l org.apache.sling.launchpad-9.jar

真实回显:

-rw-r--r-- 1 root root 102350955 Oct 12 05:12 org.apache.sling.launchpad-9.jar

4.2 编写 Dockerfile

FROM eclipse-temurin:8-jre

# 将 launchpad standalone jar 复制进镜像
COPY org.apache.sling.launchpad-9.jar /opt/sling/org.apache.sling.launchpad-9.jar

WORKDIR /opt/sling
EXPOSE 8080

ENV JAVA_OPTS="-Xms256m -Xmx512m"

CMD ["sh", "-c", "exec java $JAVA_OPTS -jar /opt/sling/org.apache.sling.launchpad-9.jar"]

💡 CMD 使用 exec 让 Java 进程替换 shell 成为 PID 1,docker stop 信号可直接送达 JVM;JVM 堆由 JAVA_OPTS 控制在 256-512MB。

4.3 编写 docker-compose.yml

services:
  sling:
    build: .
    image: sling:launchpad9
    container_name: sling-launchpad9
    restart: unless-stopped
    mem_limit: 1g
    ports:
      - "18080:8080"
    environment:
      JAVA_OPTS: "-Xms256m -Xmx512m"
    volumes:
      - ./sling-data:/opt/sling/sling
配置项说明
build: . + image: sling:launchpad9用当前目录 Dockerfile 构建并命名镜像
ports: "18080:8080"宿主机 18080 映射镜像内 8080(8080 空闲时可改 8080:8080)
environment: JAVA_OPTS注入 JVM 堆参数 -Xms256m -Xmx512m
volumes: ./sling-data:/opt/sling/slingsling home(bundle 缓存、Oak 仓储、日志)落盘宿主机
mem_limit: 1g实例内存上限 1GB(JVM 堆仍由参数控制在 256-512MB)
restart: unless-stopped异常退出自动拉起

4.4 构建并启动

# docker compose up -d --build
 Network sling-compose_default Created
 Container sling-launchpad9 Created
 Container sling-launchpad9 Started

⚠️ 若宿主机目标端口被占用,启动会报 failed to bind host port 0.0.0.0:8080/tcp: address already in use(实测报错原文),此时改映射端口后重新 docker compose up -d 即可。

4.5 验证服务

# docker compose ps
NAME               STATUS          PORTS
sling-launchpad9   Up 30 seconds   0.0.0.0:18080->8080/tcp, [::]:18080->8080/tcp

# curl -s -o /dev/null -w "home=%{http_code}\n" http://localhost:18080/
home=302

首启约需 30 秒完成 bundle 安装;查看启动日志确认:

# docker compose logs --tail 3 sling
sling-launchpad9  | Loading validation.properties via file I/O failed.
sling-launchpad9  | Attempting to load validation.properties via the classpath.
sling-launchpad9  | SUCCESSFULLY LOADED validation.properties via the CLASSPATH from '/ (root)' using class loader for DefaultSecurityConfiguration class!

JVM 参数生效核验(docker top 观察进程命令行):

# docker top sling-launchpad9 | tail -1
java -Xms256m -Xmx512m -jar /opt/sling/org.apache.sling.launchpad-9.jar

内容写读验证(新实例默认口令为 admin/admin):

# curl -s -o /dev/null -w "post=%{http_code}\n" -u admin:admin -F"sling:resourceType=foo" -F"title=compose" http://localhost:18080/content/cnode
post=201
# curl -s -u admin:admin http://localhost:18080/content/cnode.json
{"jcr:primaryType":"sling:OrderedFolder","jcr:createdBy":"admin","jcr:created":"Mon Oct 12 2026 05:30:52 GMT+0000","title":"compose","sling:resourceType":"foo"}

修改管理密码(后续操作统一使用 admin/q1w2e3r4):

# curl -s -o /dev/null -w "chg=%{http_code}\n" -u admin:admin -X POST -F"oldPwd=admin" -F"newPwd=q1w2e3r4" -F"newPwdConfirm=q1w2e3r4" http://localhost:18080/system/userManager/user/admin.changePassword.html
chg=200
# curl -s -o /dev/null -w "newpwd=%{http_code}\n" -u admin:q1w2e3r4 http://localhost:18080/index.html
newpwd=200

五、数据持久化说明

  • ./sling-data 挂载到 /opt/sling/sling(sling home),实测落盘内容:
conf  config  felix  installer  logs  org.apache.sling.launchpad.base.jar  repository  sling.properties
  • 内容数据在 sling-data/repository/(Oak segmentstore),日志在 sling-data/logs/。
  • 持久化实测:docker compose down 后再 docker compose up -d,重新 GET 上述节点仍返回原数据:
{"jcr:primaryType":"sling:OrderedFolder","jcr:createdBy":"admin","jcr:created":"Mon Oct 12 2026 05:30:52 GMT+0000","title":"compose","sling:resourceType":"foo"}
  • docker compose down 不删除 ./sling-data;如需彻底清空实例,删除该目录后重启即重建全新 sling home。

六、常用环境变量表

环境变量说明本指南值
JAVA_OPTSJVM 参数(堆、GC 等),经 CMD 展开进 java 命令-Xms256m -Xmx512m
JAVA_TOOL_OPTIONSJVM 内置识别的兜底注入变量(不设时 JVM 忽略)未设置

JVM 堆限 256-512MB:environment 中 JAVA_OPTS: "-Xms256m -Xmx512m",生效值用 docker top sling-launchpad9 核验(见 4.5 节回显)。修改后需 docker compose up -d 重建实例生效。

七、常用配置参数说明(command / ports / volumes)

配置项可选值说明
ports"8080:8080" / "18080:8080"宿主机空闲即可;Sling 监听端口由镜像内 8080 决定
volumes./sling-data:/opt/sling/slingsling home 整目录挂载,含仓储与日志
volumes(可选)./conf:/opt/sling/conf额外挂载自定义文件目录
environmentJAVA_OPTS=-Dsling.run.modes=author追加运行模式等系统属性
mem_limit1g实例内存上限,防止单服务占满宿主机

Sling 的服务端口由 sling home 中自动生成的 sling.properties(键 org.osgi.service.http.port,默认 8080)控制;如需改镜像内端口,可在 environment 注入 JAVA_OPTS: "-Dorg.osgi.service.http.port=8081" 并同步调整 ports 映射。

八、配置文件持久化(sling home 挂载)

首次 up 后,./sling-data/sling.properties 即为真实生效的框架属性文件(文件头注释 #Overlay properties for configuration),端口、日志、存储路径等键都在其中。修改流程:

vi ./sling-data/sling.properties     # 例如改 org.osgi.service.http.port=8081
docker compose restart sling         # 重启生效(重启后用新端口访问)

⚠️ 改端口需同步修改 ports 映射;sling-data/logs/ 下 error.log、request.log、access.log 均随挂载目录持久化,可直接在宿主机 tail 排障。

九、等价 docker run 运行方式

不写 docker-compose.yml 时,可用单条 docker run 达成同等效果:

docker run -d --name sling-launchpad9 \
  -p 18080:8080 \
  -e JAVA_OPTS="-Xms256m -Xmx512m" \
  --memory 1g \
  -v /opt/sling-compose/sling-data:/opt/sling/sling \
  --restart unless-stopped \
  sling:launchpad9

(镜像需先经 4.2/4.4 的 docker compose build 或 docker build -t sling:launchpad9 . 构建。)

十、常用运维命令

docker compose up -d              # 启动
docker compose up -d --build      # 改 Dockerfile 后重新构建并启动
docker compose ps                 # 查看服务状态
docker compose logs -f sling      # 跟踪日志
docker compose restart sling      # 重启 sling 服务
docker compose stop sling         # 停止(保留实例)
docker compose down               # 停止并删除实例(保留 ./sling-data 数据)
docker top sling-launchpad9       # 查看 JVM 进程命令行

十一、常见问题(FAQ)

Q1:docker compose up 报 failed to bind host port ... address already in use?

原因:宿主机目标端口被其他进程占用(实测 8080 被占)。解决:换 ports 映射(如 18080:8080)后重新 up。

Q2:构建时拉不到 openjdk:8-jre-slim,报 denied?

实测:openjdk 官方镜像已弃用,Docker Hub 返回 denied。解决:改用 eclipse-temurin:8-jre(本指南基础镜像)。

Q3:服务 Up 但 curl 拒绝连接或返回 000?

原因:首次启动需安装 bundle(约 30 秒),未完成前端口未监听。解决:docker compose logs -f sling 观察到日志持续输出后再试;判断标准为 curl http://localhost:18080/ 返回 302。

Q4:重启后内容节点不见了?

原因:未挂载 ./sling-data:/opt/sling/sling,数据写在了实例内部,down 后丢失。解决:按 4.3 节配置 volumes;已有数据无法找回,重新初始化。

Q5:默认口令登录返回 401?

原因:口令已被修改(本文改为 q1w2e3r4)。解决:使用修改后的口令;遗忘时可删除 sling-data 重建全新实例(默认口令恢复为 admin/admin,数据同时清空,先备份)。

十二、参考链接