Apache OFBiz 24.09.07 Docker Compose 部署指南

使用 Docker Compose 部署 Apache OFBiz 24.09.07,基于官方 Dockerfile 构建 ofbiz-docker 镜像并搭配 PostgreSQL 13,覆盖镜像选型、compose 编排、环境变量、数据持久化、等价 docker run 与运维命令,镜像构建与登录验证均实测

Apache OFBizApache OFBiz2026/10/12

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_USERadmin管理员用户名
OFBIZ_ADMIN_PASSWORDofbiz管理员密码(生产必须显式覆盖)
OFBIZ_DATA_LOADseednone / seed / demo:加载何种数据
OFBIZ_HOSTsecurity.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 / PASSWORDofbiz / ofbiz / ofbiz主库连接
OFBIZ_POSTGRES_OLAP_DB / USER / PASSWORDofbizolap / ofbizolap / ofbizolapOLAP 库连接
OFBIZ_POSTGRES_TENANT_DB / USER / PASSWORDofbiztenant / ofbiztenant / ofbiztenant租户库连接
OFBIZ_DISABLE_COMPONENTSplugins/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: 声明)。

十二、参考链接