Apache OFBiz 24.09.07 Docker Compose 部署指南
使用 Docker Compose 部署 Apache OFBiz 24.09.07,基于官方 Dockerfile 构建 ofbiz-docker 镜像并搭配 PostgreSQL 13,覆盖镜像选型、compose 编排、环境变量、数据持久化、等价 docker run 与运维命令,镜像构建与登录验证均实测
Apache OFBiz 24.09.07 Docker Compose 部署指南
目标:使用 Docker Compose 在 Docker 主机上编排部署 Apache OFBiz 24.09.07(镜像
ofbiz-docker:24.09.07由官方 Dockerfile 构建 + 数据库postgres:13),覆盖镜像选型、compose 编排、环境变量注入、数据持久化、等价 docker run 与常用运维命令。镜像构建、compose 启动与 admin 登录验证均实测。
一、环境信息
- Docker:29.8.1(含 docker compose v2 插件,BuildKit v0.37.1)
- OFBiz 镜像:
ofbiz-docker:24.09.07(基于官方 Dockerfile 本地构建,基础镜像eclipse-temurin:17) - 数据库镜像:
postgres:13(官方示例指定) - 对外端口:8443(HTTPS,映射宿主机 8443)
- OFBiz 容器内数据目录:
/ofbiz(含runtime/、config/、lib-extra/挂载点) - 默认账号:
admin/ofbiz(实测登录通过)
二、镜像选型说明
| 选项 | 镜像 | 说明 |
|---|---|---|
| 官方预编译镜像 | 无 | 实测 Docker Hub 上不存在 apache/ofbiz 官方预编译镜像 |
| 官方 Dockerfile 构建(推荐) | ofbiz-docker:24.09.07 | 发行包自带 Dockerfile,docker build --tag ofbiz-docker . 构建 |
| 数据库 | postgres:13 | 官方 compose 示例指定;也可用内置 Derby(不推荐在容器内持久化) |
💡 发行包内 Docker 相关文件:
Dockerfile、DOCKER.adoc(构建/运行文档)、docker/docker-entrypoint.sh(容器初始化入口脚本)、docker/examples/postgres-demo/(官方 compose 示例,含docker-compose.yml与 env 文件)。
三、前置条件
- Docker 主机(建议 4GB+ 内存;镜像构建阶段 Gradle 下载依赖 + 编译,耗时较长,实测约数十分钟,需耐心等待或复用
--mount=type=cache的 Gradle 缓存)。 - OFBiz 24.09.07 源码/发行包已解压(含
Dockerfile与docker/目录)。 - 可访问外网:构建阶段需下载 Gradle 发行版与 Maven 依赖;运行阶段 compose 需拉取
eclipse-temurin:17、postgres:13。
四、部署步骤
4.1 构建 OFBiz 镜像
在 OFBiz 源码目录执行(官方 DOCKER.adoc 命令):
cd /opt/ofbiz
docker build --tag ofbiz-docker:24.09.07 .
构建分为两阶段:builder 阶段(eclipse-temurin:17 中 gradlew generateSecretKeys distTar 产出发行包)与 runtime 阶段(解压发行包、创建 ofbiz 用户与挂载目录、安装 xsltproc)。构建成功回显末行:
=> exporting to image
=> => naming to docker.io/library/ofbiz-docker:24.09.07
⚠️ 若构建环境无法访问 GitHub raw(
gradle/init-gradle-wrapper.sh需下载gradle-wrapper.jar),可将发行包内的gradle/wrapper/gradle-wrapper.jar加入构建上下文并让 Dockerfile 先COPY gradle/wrapper/gradle-wrapper.jar gradle/wrapper/;本指南实测按此方式完成构建。
4.2 准备 compose 编排文件
创建部署目录并写入 docker-compose.yml(内容取自官方 docker/examples/postgres-demo/docker-compose.yml,镜像名替换为本地构建的 ofbiz-docker:24.09.07):
services:
db:
image: postgres:13
mem_limit: 300M
memswap_limit: 300M
cpu_shares: 200
restart: "no"
volumes:
- ./postgres-initdb.d:/docker-entrypoint-initdb.d
env_file:
- postgres.env
- ofbiz-postgres.env
ofbiz:
image: ofbiz-docker:24.09.07
mem_limit: 1600M
memswap_limit: 1600M
cpu_shares: 200
ports:
- 8443:8443
volumes:
- ./after-config-applied.d:/docker-entrypoint-hooks/after-config-applied.d
# 宿主机该目录需确保容器内 ofbiz 用户(uid 1000)可写,日志才能落盘
- ./logs:/ofbiz/runtime/logs
env_file:
- ofbiz-postgres.env
environment:
OFBIZ_DATA_LOAD: demo
OFBIZ_HOST: example.internal
OFBIZ_CONTENT_URL_PREFIX: https://example.internal:8443
💡 官方示例中 ofbiz 服务未声明
depends_on,db 初始化由入口脚本按OFBIZ_POSTGRES_HOST自动等待数据库就绪;如需严格顺序可自行添加depends_on: [db](db 需加 healthcheck)。
4.3 准备环境变量文件
ofbiz-postgres.env(OFBiz 侧 PostgreSQL 连接参数,取自官方示例,生产环境请改为强口令):
OFBIZ_POSTGRES_HOST=db
OFBIZ_POSTGRES_OFBIZ_DB=ofbizmaindb
OFBIZ_POSTGRES_OFBIZ_USER=ofbiz
OFBIZ_POSTGRES_OFBIZ_PASSWORD="Ab6SqDD2YM2lmEsvao-"
OFBIZ_POSTGRES_OLAP_DB=ofbizolapdb
OFBIZ_POSTGRES_OLAP_USER=ofbizolap
OFBIZ_POSTGRES_OLAP_PASSWORD="P7TFUtQHSuvha8gSxMME"
OFBIZ_POSTGRES_TENANT_DB=ofbiztenantdb
OFBIZ_POSTGRES_TENANT_USER=ofbiztenant
OFBIZ_POSTGRES_TENANT_PASSWORD="4oXET73QGriblUejjbvR"
postgres.env(PostgreSQL 超级用户初始化,取自官方示例):
POSTGRES_PASSWORD="20wganpfDASBtBXY7GQ6"
初始化脚本目录 postgres-initdb.d/10-init-user-db.sh(官方示例:创建 ofbiz/ofbizolap/ofbiztenant 三个库与用户)。
4.4 启动
docker compose up -d
实测回显:
Container ofbiz-compose-db-1 Created
Container ofbiz-compose-ofbiz-1 Created
Container ofbiz-compose-db-1 Starting
Container ofbiz-compose-ofbiz-1 Starting
Container ofbiz-compose-db-1 Started
Container ofbiz-compose-ofbiz-1 Started
首次启动流程:db 初始化 PostgreSQL 并创建 ofbiz/ofbizolap/ofbiztenant 三个库;ofbiz 容器入口脚本按 OFBIZ_DATA_LOAD: demo 应用配置(生成 entityengine.xml、security.properties、url.properties 到 /ofbiz/config/)、加载演示数据,随后启动 OFBiz,约 2-5 分钟后 8443 端口就绪。数据加载完成回显:
ofbiz-1 | 2026-10-11 20:14:20,710 |main |EntityDataLoadContainer |I| =-=-=-=-=-=-= Finished the data load with 16536 rows changed.
查看服务状态:
docker compose ps
实测回显(宿主机 8443 被其他服务占用时改用 8444 映射,见下):
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
ofbiz-compose-db-1 postgres:13 "docker-entrypoint.s…" db 15 minutes ago Up 15 minutes 5432/tcp
ofbiz-compose-ofbiz-1 ofbiz-docker:24.09.07 "/ofbiz/docker-entry…" ofbiz 14 minutes ago Up 2 minutes 5005/tcp, 8009/tcp, 0.0.0.0:8444->8443/tcp, [::]:8444->8443/tcp
💡 默认映射为
8443:8443;若宿主机 8443 已被占用,可改为8444:8443(本指南实测即采用 8444)。容器的 8443 端口是 OFBiz 的 HTTPS 端口,容器内还有 8009(AJP)、5005(调试)监听。
4.5 验证登录
OFBiz 默认启用 host header 注入防护:OFBIZ_HOST 配置为 example.internal 后,用 localhost 访问会被拒绝(回显 Domain localhost not accepted to prevent host header injection,HTTP 500)。需按配置的域名访问(本指南实测宿主机映射 8444,域名经 --resolve 指向本机):
curl -sk --resolve example.internal:8444:127.0.0.1 \
https://example.internal:8444/webtools/control/login
回显:HTTP 200,页面标题 OFBiz: Web Tools: Login。
提交默认账号登录(OFBIZ_ADMIN_USER=admin、OFBIZ_ADMIN_PASSWORD=ofbiz):
curl -sk --resolve example.internal:8444:127.0.0.1 \
-c /tmp/ofbiz-cookies.txt -b /tmp/ofbiz-cookies.txt \
-X POST https://example.internal:8444/webtools/control/login \
-d "USERNAME=admin&PASSWORD=ofbiz"
回显:HTTP 200,页面标题 OFBiz: Web Tools: Web Tools Main Page,登录成功。
五、数据持久化说明
| 数据 | 容器内路径 | 持久化方式 |
|---|---|---|
| OFBiz 运行日志 | /ofbiz/runtime/logs | 卷挂载 ./logs:/ofbiz/runtime/logs(宿主机需允许 uid 1000 写入) |
| PostgreSQL 数据 | /var/lib/postgresql/data | 未在官方示例中挂载;生产务必加 volumes: - pgdata:/var/lib/postgresql/data 命名卷 |
| Derby(如用内置库) | /ofbiz/runtime/data | 生产不建议容器内 Derby,数据易随容器重建丢失 |
| 初始化状态 | /ofbiz/runtime/container_state | 入口脚本记录 data_loaded/admin_loaded/config_applied 标记 |
六、常用环境变量表
(变量取自官方 docker/docker-entrypoint.sh 头部文档,实测文件内容一致)
| 变量 | 默认值 | 说明 |
|---|---|---|
| OFBIZ_SKIP_INIT | 空 | 非空则跳过所有初始化步骤 |
| OFBIZ_ADMIN_USER | admin | 管理员用户名 |
| OFBIZ_ADMIN_PASSWORD | ofbiz | 管理员密码(生产必须显式覆盖) |
| OFBIZ_DATA_LOAD | seed | none / seed / demo:加载何种数据 |
| OFBIZ_HOST | security.properties 默认 | 填充 host-headers-allowed |
| OFBIZ_CONTENT_URL_PREFIX | 空 | 设置 url.properties 的 content.url.prefix.secure/standard |
| OFBIZ_ENABLE_AJP_PORT | 空 | 非空则启用 AJP 8009 端口 |
| OFBIZ_SKIP_DB_DRIVER_DOWNLOAD | 空 | 非空则跳过数据库驱动下载 |
| OFBIZ_POSTGRES_HOST | 空 | 非空时启用 PostgreSQL 三库配置(下述 OFBIZ_POSTGRES_* 生效) |
| OFBIZ_POSTGRES_OFBIZ_DB / USER / PASSWORD | ofbiz / ofbiz / ofbiz | 主库连接 |
| OFBIZ_POSTGRES_OLAP_DB / USER / PASSWORD | ofbizolap / ofbizolap / ofbizolap | OLAP 库连接 |
| OFBIZ_POSTGRES_TENANT_DB / USER / PASSWORD | ofbiztenant / ofbiztenant / ofbiztenant | 租户库连接 |
| OFBIZ_DISABLE_COMPONENTS | plugins/birt/ofbiz-component.xml | 逗号分隔禁用组件路径 |
七、常用配置参数说明(command)
镜像默认入口为 docker/docker-entrypoint.sh,其后参数原样传给 OFBiz 启动命令。等价于容器内执行:
docker-entrypoint.sh ofbiz
可替换 command 为 OFBiz CLI 形态,例如仅启动不做初始化:
command: ["ofbiz"]
或带启动参数:
command: ["ofbiz", "--portoffset", "100"]
八、配置文件持久化(conf 挂载)
初始化钩子目录(脚本须可执行且以 .sh 结尾):
| 挂载点 | 触发时机 |
|---|---|
/docker-entrypoint-hooks/before-config-applied.d | 应用配置修改前 |
/docker-entrypoint-hooks/after-config-applied.d | 应用配置修改后(官方示例在此注入 Solr 配置) |
/docker-entrypoint-hooks/before-data-load.d | 数据加载前 |
/docker-entrypoint-hooks/additional-data.d | 额外数据文件(.xml)加载(在 seed/demo 之后) |
/docker-entrypoint-hooks/after-data-load.d | 数据加载后 |
示例(官方示例自带的 after-config-applied.d/applySolrConfig.sh 类脚本):
volumes:
- ./after-config-applied.d:/docker-entrypoint-hooks/after-config-applied.d
OFBiz 自身配置文件位于容器 /ofbiz/framework/**/config/,如需自定义(如端口 ofbiz-component.xml、安全 security.properties),可用 bind mount 覆盖或经初始化钩子在启动前改写。
九、等价 docker run 运行方式
不使用 compose 时,等价命令(单机演示,数据库同样用 postgres 容器):
docker run -d --name ofbiz-postgres \
-e POSTGRES_PASSWORD="20wganpfDASBtBXY7GQ6" \
-v $(pwd)/postgres-initdb.d:/docker-entrypoint-initdb.d \
postgres:13
docker run -d --name ofbiz \
-p 8443:8443 \
-e OFBIZ_POSTGRES_HOST=ofbiz-postgres \
-e OFBIZ_POSTGRES_OFBIZ_DB=ofbizmaindb \
-e OFBIZ_POSTGRES_OFBIZ_USER=ofbiz \
-e OFBIZ_POSTGRES_OFBIZ_PASSWORD="Ab6SqDD2YM2lmEsvao-" \
-e OFBIZ_DATA_LOAD=demo \
-v $(pwd)/logs:/ofbiz/runtime/logs \
ofbiz-docker:24.09.07
💡 两容器需在同一网络(compose 自动创建;docker run 场景可
docker network create ofbiz-net并把两个容器都--network ofbiz-net挂入,OFBIZ_POSTGRES_HOST指向 db 容器名)。
十、常用运维命令
docker compose ps # 查看服务状态
docker compose logs -f ofbiz # 跟踪 OFBiz 日志(/ofbiz/runtime/logs)
docker compose exec ofbiz sh -c 'ps -ef | grep java' # 容器内查看 Java 进程
docker compose exec db psql -U ofbiz -d ofbizmaindb -c '\l' # 查看 PostgreSQL 库
docker compose restart ofbiz # 重启 OFBiz 服务
docker compose down # 停止并移除容器(-v 同时删命名卷,慎用)
日志落盘位置:宿主机 ./logs/ofbiz.log(与容器 /ofbiz/runtime/logs/ofbiz.log 一致)。
十一、常见问题(FAQ)
11.1 构建镜像时 gradle-wrapper.jar 下载失败
错误回显:
Download of gradle-wrapper.jar from https://github.com/gradle/gradle/raw/v8.14.5/gradle/wrapper/gradle-wrapper.jar failed.
定位:构建环境无法访问 GitHub raw。
解决:把发行包内已有的 gradle/wrapper/gradle-wrapper.jar 一并作为构建上下文,并在 Dockerfile 中 COPY gradle/wrapper/gradle-wrapper.jar gradle/wrapper/ 后再执行 gradle/init-gradle-wrapper.sh(本指南实测采用此法)。
11.2 8443 端口迟迟未就绪
定位:OFBIZ_DATA_LOAD: demo 首次启动需完整加载演示数据(16536 行,数分钟);或 OFBIZ 等待 PostgreSQL 初始化。
解决:docker compose logs -f ofbiz 观察 Finished the data load 日志;确认 db 容器 Up (healthy) 后重启 ofbiz 服务。
11.3 官方示例钩子 applySolrConfig.sh 导致容器启动失败
错误回显(容器退出码 2):
++ '[' -d /ofbiz/plugins/solr ']'
++ sed 's/^solr.webapp.domainName=.*/solr.webapp.domainName=example.internal/' /ofbiz/plugins/solr/config/solrconfig.properties
sed: can't read /ofbiz/plugins/solr/config/solrconfig.properties: No such file or directory
定位:官方 docker/examples/postgres-demo 的 after-config-applied.d/applySolrConfig.sh 用 [ -d /ofbiz/plugins/solr ] 判断,但标准镜像内 plugins/solr 目录存在、其 config/solrconfig.properties 并不存在;入口脚本 set -e 遇到 sed 失败即终止容器(本指南实测复现)。
解决:把钩子判断改为文件级 [ -f /ofbiz/plugins/solr/config/solrconfig.properties ],或删除/清空 after-config-applied.d 挂载目录(本指南实测按文件级判断修复后正常启动)。
11.4 访问 localhost 报 Domain not accepted / HTTP 500
错误回显:
RequestHandlerException: Domain localhost not accepted to prevent host header injection.
You need to set host-headers-allowed property in security.properties file.
定位:OFBiz 的 host header 注入防护。OFBIZ_HOST: example.internal 已写入 security.properties 的 host-headers-allowed,localhost 不在允许列表。
解决:用配置的域名访问(见 4.5 的 --resolve 示例),或按需调整 OFBIZ_HOST/host-headers-allowed。
11.5 登录提示密码错误
定位:OFBIZ_ADMIN_PASSWORD 未覆盖时使用默认 ofbiz;数据已加载过的卷里可能残留旧管理员。
解决:显式设置 OFBIZ_ADMIN_USER/OFBIZ_ADMIN_PASSWORD;或删除 OFBiz 数据卷后重新 up(仅限演示环境)。
11.6 日志目录写不进去
定位:宿主机挂载目录属主不是 uid 1000(ofbiz 用户)。
解决:chown -R 1000:1000 ./logs 或改用 Docker 命名卷(compose volumes: 声明)。
十二、参考链接
- Apache OFBiz 下载:https://dlcdn.apache.org/ofbiz/
- OFBiz 官方文档(含 Docker 章节):https://ofbiz.apache.org/
- OFBiz Docker 文档(发行包内):
DOCKER.adoc - 官方 compose 示例:发行包内
docker/examples/postgres-demo/docker-compose.yml - PostgreSQL 镜像:https://hub.docker.com/_/postgres