如何通过docker compose构建含ant build.xml的JEE应用并部署到WebSphere
基于Docker Compose的JEE应用自动化构建部署方案
整体流程逻辑:通过一次性构建容器完成Ant编译打包,通过共享卷在容器间传递构建产物,编排三个中间件的启动顺序,在WebSphere启动阶段自动完成资源配置与应用部署,全程不需要手动操作。
前置确认项
- 核对本地已有的Oracle、WebSphere、MQ三个镜像的版本、默认端口、内置JDK版本、默认安装路径
- 确认JEE应用
build.xml中构建生产包的target名称、产物默认输出路径,确保构建依赖的配置项(比如数据库地址、MQ地址可以在构建阶段通过参数传入,或者留到部署阶段通过JNDI配置) - 提前准备WebSphere的wsadmin管理脚本,用来完成数据源配置、MQ连接配置、应用部署操作,避免手动登录控制台操作。
核心实现配置
直接在项目根目录创建docker-compose.yml,配置示例如下,根据自己的实际参数替换占位内容即可:
version: '3.8' # 自定义桥接网络,所有服务内网互通 networks: jee-network: driver: bridge # 命名卷,分别存中间件持久化数据和应用构建产物 volumes: oracle-data: mq-data: app-artifacts: services: # 应用构建服务,构建完成后自动退出 app-builder: image: 本地匹配JDK版本的Ant镜像 # 没有的话可以用公开的对应JDK版本Ant镜像 volumes: - ./本地JEE应用代码根目录:/src - app-artifacts:/build/dist working_dir: /src command: ant -Ddist.dir=/build/dist 你的build.xml生产包target名 # 构建产物直接输出到共享卷 networks: - jee-network oracle-db: image: 本地已有的Oracle镜像名:版本标签 environment: - ORACLE_SID=你的数据库SID - ORACLE_PWD=你的数据库密码 volumes: - oracle-data:/opt/oracle/oradata ports: - "1521:1521" healthcheck: test: ["CMD", "sqlplus", "-L", "验证账号/验证密码@//localhost:1521/你的SID", "AS", "SYSDBA", "select 1 from dual;"] interval: 10s timeout: 5s retries: 10 networks: - jee-network ibm-mq: image: 本地已有的MQ镜像名:版本标签 environment: - MQ_QMGR_NAME=你的队列管理器名称 - MQ_APP_PASSWORD=你的MQ连接密码 volumes: - mq-data:/var/mqm ports: - "1414:1414" - "9443:9443" healthcheck: test: ["CMD", "dspmq", "-n", "-m", "你的队列管理器名称"] interval: 10s timeout: 5s retries: 10 networks: - jee-network websphere-app: image: 本地已有的WebSphere镜像名:版本标签 depends_on: app-builder: condition: service_completed_successfully # 等应用构建完成才启动 oracle-db: condition: service_healthy # 等数据库完成初始化才启动 ibm-mq: condition: service_healthy # 等MQ完成初始化才启动 volumes: - app-artifacts:/tmp/app-deploy # 直接挂载构建好的应用包 - ./本地wsadmin脚本目录:/opt/ibm/config # 挂载提前写好的配置、部署脚本 ports: - "9043:9043" - "9080:9080" command: > /bin/bash -c " /opt/IBM/WebSphere/AppServer/bin/wsadmin.sh -lang jython -f /opt/ibm/config/datasource.py && /opt/IBM/WebSphere/AppServer/bin/wsadmin.sh -lang jython -f /opt/ibm/config/mq-config.py && /opt/IBM/WebSphere/AppServer/bin/wsadmin.sh -lang jython -f /opt/ibm/config/deploy-app.py && /opt/IBM/WebSphere/AppServer/bin/startServer.sh server1 " networks: - jee-network
关键注意点
- JDK版本匹配:app-builder服务使用的Ant镜像内置的JDK大版本,必须和WebSphere镜像内置的JDK大版本完全一致,否则编译出的字节码会因为版本不兼容导致部署失败。
- 服务依赖判断:不要直接用默认的
depends_on配置,必须加健康检查和完成状态判断。Oracle、MQ容器启动后需要几十秒到数分钟完成初始化,如果直接拉起WebSphere会出现连接失败的问题;app-builder是一次性任务,必须等构建成功生成产物后再启动WebSphere。 - 网络连通配置:所有服务加入同一个自定义桥接网络后,容器间可以直接通过服务名作为域名访问,比如Oracle的连接地址写
oracle-db:1521,MQ的连接地址写ibm-mq:1414,不需要手动指定容器IP。 - 构建产物传递:直接在Ant构建参数里把输出目录指定到共享卷
app-artifacts的挂载路径,不需要额外做拷贝操作,构建完成后WebSphere容器可以直接读取到安装包。 - WebSphere启动逻辑:如果你的基础WebSphere镜像已经提前配置好了JDBC驱动、MQ客户端、基础连接参数,可以直接跳过wsadmin配置步骤,只保留应用部署和服务启动命令即可,减少容器启动耗时。
验证流程
- 首次部署先单独执行
docker compose run app-builder,确认Ant构建流程正常,没有编译错误,共享卷内能生成正确的ear/war部署包。 - 构建验证通过后执行
docker compose up -d启动全量服务,通过docker compose logs -f websphere-app查看启动日志,确认没有部署错误、连接错误。 - 服务启动完成后访问WebSphere管理控制台(默认端口9043),确认应用状态为已启动,再验证应用的数据库操作、MQ消息收发功能正常。
- 后续代码迭代时,只需要重新执行
docker compose up app-builder完成增量构建,再重启websphere服务即可完成版本更新,不需要重启数据库和MQ服务。
内容的提问来源于stack exchange,提问作者Lamyae Mekouar
相关产品推荐
相关产品推荐

