如何让基于IBM WebSphere Traditional的Docker镜像默认开启DEBUG模式
问题背景
我们有一个运行在传统WebSphere上的WAR应用,本地测试时基于镜像ibmcom/websphere-traditional:8.5.5.22构建Docker镜像。当前远程调试容器内应用时,得手动通过管理控制台开启服务器DEBUG模式并重启,想让应用服务器默认就以DEBUG模式启动。
问题更新
尝试用wsadmin脚本写了下面这个Python函数,加到install.py里后没生效,想问下这类Python脚本的日志或标准输出在哪看?
def enableDebug(): try: server1 = AdminConfig.getid('/Cell:DefaultCell01/Node:DefaultNode01/Server:server1/') AdminConfig.create('DebugService', server1, '[[BSFDebugPort "4444"] [enable "true"] [jvmDebugPort "7777"] [jvmDebugArgs "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=7777"] [debugClassFilters ""] [BSFLoggingLevel "0"]]') jvm = AdminConfig.list('JavaVirtualMachine', server1) AdminConfig.modify(jvm[0], '[[debugMode "true"]]') except: logger("EXCEPTION ENABLING DEBUG FOR server1")
一、wsadmin脚本日志在哪看
容器内WebSphere日志目录
日志默认存在WebSphere的配置目录里,路径一般是:/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/logs/server1/
重点看SystemOut.log和SystemErr.log,wsadmin脚本的输出、异常都会写到这两个文件里。控制台实时输出
如果是构建Docker镜像时执行install.py,直接看构建过程的控制台输出就行;如果是容器运行时执行的脚本,用docker logs <容器ID>就能看实时输出。脚本内主动输出
你脚本里用了logger函数,但得确保这个函数已经正确定义并关联到WebSphere的日志系统。嫌麻烦的话直接换成print()语句,输出会直接写到SystemOut.log里,比如把异常输出改成:print("EXCEPTION ENABLING DEBUG FOR server1")
二、修正脚本让DEBUG生效
你的脚本有几个可能导致失效的问题,调整后试试:
正确处理JVM ID
AdminConfig.list返回的是字符串格式的JVM ID列表,直接取jvm[0]可能拿到的是无效字符,得先拆分处理:jvm_list = AdminConfig.list('JavaVirtualMachine', server1).splitlines() if jvm_list: jvm = jvm_list[0].strip() AdminConfig.modify(jvm, '[[debugMode "true"]]')避免重复创建DebugService
先检查DebugService是否已经存在,重复创建会报错:debug_service = AdminConfig.list('DebugService', server1) if not debug_service: AdminConfig.create('DebugService', server1, '[[BSFDebugPort "4444"] [enable "true"] [jvmDebugPort "7777"] [jvmDebugArgs "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=7777"] [debugClassFilters ""] [BSFLoggingLevel "0"]]') else: AdminConfig.modify(debug_service, '[[enable "true"] [jvmDebugArgs "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=7777"]]')保存并同步配置
修改完配置必须保存并同步节点,不然配置不会生效:AdminConfig.save() AdminNodeManagement.syncActiveNodes()
三、Docker镜像构建时自动开DEBUG的其他方法
除了wsadmin脚本,还能直接改WebSphere的JVM启动参数:
- 在Dockerfile里加命令,直接修改server1的配置文件:
RUN sed -i '/<jvmEntries/i <jvmEntries debugMode="true" debugArgs="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=7777"' /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/config/cells/DefaultCell01/nodes/DefaultNode01/servers/server1/server.xml - 构建镜像时记得暴露调试端口:
EXPOSE 7777
内容的提问来源于stack exchange,提问作者CalleWirsch

