如何在WebLogic容器中自动创建数据源?
解决方案:在Docker中自动创建WebLogic数据源
你遇到的问题很典型——在Dockerfile构建阶段执行WLST脚本时,WebLogic实例还没启动,所以connect()命令必然失败。下面提供两种可靠的实现方式:
方式一:调整WLST脚本执行时机(推荐用于动态配置)
不要在Dockerfile的RUN指令中执行WLST脚本,而是把它放到WebLogic启动后的初始化钩子里,确保AdminServer完全就绪后再执行配置:
修改Dockerfile,将配置文件和脚本复制到镜像中,然后自定义entrypoint脚本:
# 复制配置文件和脚本到指定目录 COPY shaolin-datasource.properties /u01/oracle/user_projects/domains/base_domain/properties/ COPY create-datasource.py /u01/oracle/ COPY start-domain-with-ds.sh /u01/oracle/ # 设置entrypoint ENTRYPOINT ["/u01/oracle/start-domain-with-ds.sh"]编写
start-domain-with-ds.sh脚本,先启动WebLogic,等待AdminServer就绪后执行WLST:#!/bin/bash set -e # 启动WebLogic AdminServer nohup /u01/oracle/user_projects/domains/base_domain/startWebLogic.sh & # 等待AdminServer就绪(可根据实际情况调整等待逻辑,比如检查端口或控制台状态) echo "Waiting for AdminServer to start..." while ! nc -z localhost 7001; do sleep 5 done # 执行WLST脚本创建数据源 /u01/oracle/wlst /u01/oracle/create-datasource.py # 保持容器运行(若WebLogic前台启动可去掉此命令,按需调整) tail -f /u01/oracle/user_projects/domains/base_domain/servers/AdminServer/logs/AdminServer.log优化WLST脚本:建议在
connect()前添加重试逻辑,避免因AdminServer启动延迟导致的连接失败,比如用循环尝试连接直到成功。
方式二:预配置数据源XML文件(适合静态配置)
WebLogic支持直接读取domain目录下的配置文件自动加载数据源,你可以提前生成JDBC系统资源的XML文件,在构建镜像时放到指定目录,WebLogic启动时会自动识别加载:
手动创建(或通过WLST离线模式生成)数据源的XML配置文件,比如
shaolin-ds.xml,示例内容:<?xml version='1.0' encoding='UTF-8'?> <jdbc-system-resource xmlns="http://xmlns.oracle.com/weblogic/jdbc-system-resource"> <name>shaolin-ds</name> <jdbc-resource> <name>shaolin-ds</name> <jdbc-data-source-params> <jndi-names> <element>jdbc/shaolin-ds</element> </jndi-names> <global-transactions-protocol>OnePhaseCommit</global-transactions-protocol> </jdbc-data-source-params> <jdbc-driver-params> <url>jdbc:mysql://db-host:3306/shaolin_db</url> <driver-name>com.mysql.cj.jdbc.Driver</driver-name> <password-encrypted>{AES}...</password-encrypted> <properties> <property> <name>user</name> <value>db_user</value> </property> <property> <name>databaseName</name> <value>shaolin_db</value> </property> </properties> </jdbc-driver-params> <jdbc-connection-pool-params> <test-table-name>SELECT 1 FROM DUAL</test-table-name> </jdbc-connection-pool-params> </jdbc-resource> </jdbc-system-resource>在Dockerfile中把这个XML文件复制到domain的
config/jdbc目录下:COPY shaolin-ds.xml /u01/oracle/user_projects/domains/base_domain/config/jdbc/确保domain的
config/config.xml中包含对该数据源的引用(可通过WLST离线模式修改,或提前在domain模板中添加):<domain> <!-- 其他原有配置 --> <system-resource> <name>shaolin-ds</name> <target>AdminServer</target> <descriptor-file-name>jdbc/shaolin-ds.xml</descriptor-file-name> </system-resource> </domain>
这种方式无需启动后执行WLST脚本,WebLogic启动时会自动加载配置,适合固定的数据源配置场景。
额外提示
- 若使用Oracle官方WebLogic Docker镜像,可参考其
createDomain.sh脚本,通过添加自定义配置步骤集成数据源创建逻辑。 - 密码建议提前用WebLogic的
encrypt.sh工具加密,避免明文存储在配置文件中。
内容的提问来源于stack exchange,提问作者Enrico Suci
相关产品推荐
相关产品推荐

