WSO2 API Manager 4.2.0 gateway-worker节点Docker启动失败求助
问题
使用WSO2 API Manager 4.2.0,通过Docker部署all-in-one实例节点和gateway-worker节点时,gateway-worker节点启动失败,wso2carbon.log中出现如下错误:
ERROR {org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/]} - Exception starting filter [CaptchaFilter] java.lang.ClassNotFoundException: org.wso2.carbon.identity.captcha.filter.CaptchaFilter at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1412) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1220) at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:534) at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:515) at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:149) at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:251) at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:102) at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4609) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5248) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1383) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:916) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:835) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1383) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:916) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:265) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.wso2.carbon.tomcat.ext.service.ExtendedStandardService.startInternal(ExtendedStandardService.java:52) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.wso2.carbon.tomcat.internal.CarbonTomcat.start(CarbonTomcat.java:113) at org.wso2.carbon.tomcat.internal.ServerManager$1.run(ServerManager.java:167) at java.base/java.lang.Thread.run(Thread.java:833)
使用的Dockerfile:
FROM centos:latest RUN mkdir -p <APIM_HOME> RUN mkdir -p <JAVA_HOME> COPY ./wso2am-4.2.0.zip <APIM_HOME> COPY ./jdk-17_linux-x64_bin.tar.gz <JAVA_HOME> RUN cd /etc/yum.repos.d/ RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-* RUN yum install unzip -y RUN yum install tar -y RUN cd <APIM_HOME>/bin/ && ./profileSetup.sh -Dprofile=gateway-worker RUN cd <JAVA_HOME>/java/ && tar -xvf jdk-17_linux-x64_bin.tar.gz RUN rm -f <APIM_HOME>/repository/conf/deployment.toml EXPOSE 8243 8280 9443 ENTRYPOINT ["/bin/bash", "-c", "<APIM_HOME>/bin/api-manager.sh -Dprofile=gateway-worker"]
deployment.toml配置:
[server] hostname = "<HOSTNAME>" node_ip = "<IP>" offset=50 server_role = "gateway-worker" [user_store] type = "database_unique_id" [super_admin] username = "admin" password = "admin" create_admin_account = true [database.shared_db] type = "mysql" url = "<DB_URL>" username = "" password = "" [keystore.tls] file_name = "wso2carbon.jks" type = "JKS" password = "wso2carbon" alias = "wso2carbon" key_password = "wso2carbon" [truststore] file_name = "client-truststore.jks" type = "JKS" password = "wso2carbon" [apim.sync_runtime_artifacts.gateway] gateway_labels =["Default"] # key manager implementation [apim.key_manager] service_url = "https://Node1:9483/services/" # Traffic Manager configurations [apim.throttling] service_url = "https://Node1:9483/services/" throttle_decision_endpoints = ["tcp://Node1:5712"] [[apim.throttling.url_group]] traffic_manager_urls=["tcp://Node1:9651"] traffic_manager_auth_urls=["ssl://Node1:9751"]
解决建议
补全安装包解压步骤:Dockerfile仅复制了压缩包到
<APIM_HOME>,未执行解压命令,profileSetup.sh无法在未解压的目录下正常运行。添加解压命令:RUN cd <APIM_HOME> && unzip wso2am-4.2.0.zip && mv wso2am-4.2.0/* . && rm -rf wso2am-4.2.0 wso2am-4.2.0.zip确保
profileSetup.sh在正确的APIM安装目录下执行。移除无用的过滤器配置:Gateway Worker节点不需要CaptchaFilter组件,找到
<APIM_HOME>/repository/conf/tomcat/web.xml中CaptchaFilter的定义和映射,直接删除即可。保留默认deployment.toml基础配置:直接删除默认的
deployment.toml会缺失gateway-worker必需的组件依赖配置,建议基于默认文件修改,而非完全替换。如果必须自定义,需添加专属配置:[apim.gateway] mode = "worker"配置Java环境变量:Dockerfile中仅解压了JDK,但未设置
JAVA_HOME和PATH,添加以下命令:ENV JAVA_HOME=<JAVA_HOME>/java/jdk-17.0.x ENV PATH=$JAVA_HOME/bin:$PATH替换
jdk-17.0.x为实际解压后的JDK目录名称。完善shared_db数据库配置:当前
database.shared_db的username和password为空,需填写正确的数据库账号密码,确保gateway-worker能连接共享数据库加载必要配置。
内容的提问来源于stack exchange,提问作者Lilan Mihiranga

