Apache Sling Docker Compose 部署指南
使用 Docker Compose 一键编排自建 Sling 运行镜像,讲清基础镜像选型、构建流程、端口映射与数据目录持久化,堆内存限定并核验生效,覆盖启动验证、内容读写、密码修改与重启后数据保留,另附等价单命令运行、常用运维命令与常见问题,回显均实测
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/sling | sling 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_OPTS | JVM 参数(堆、GC 等),经 CMD 展开进 java 命令 | -Xms256m -Xmx512m |
JAVA_TOOL_OPTIONS | JVM 内置识别的兜底注入变量(不设时 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/sling | sling home 整目录挂载,含仓储与日志 |
volumes(可选) | ./conf:/opt/sling/conf | 额外挂载自定义文件目录 |
environment | JAVA_OPTS=-Dsling.run.modes=author | 追加运行模式等系统属性 |
mem_limit | 1g | 实例内存上限,防止单服务占满宿主机 |
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,数据同时清空,先备份)。
十二、参考链接
- Apache Sling 官方下载页:https://sling.apache.org/downloads.cgi
- launchpad 归档发行目录:https://archive.apache.org/dist/sling/
- Eclipse Temurin 镜像:https://hub.docker.com/_/eclipse-temurin
- Docker Compose 文档:https://docs.docker.com/compose/
- 《Apache Sling 安装指南》(jar 获取与主机直装流程)