我有一个在apache Tomcat中运行的第三方java webapp。我们正在使用docker来运行此应用程序。在我的机器上运行时,我们收到错误
我想强调一点,我们不构建这个.war
。我们不拥有此.war
。我们只是试图启动一个运行这个已经构建的代码的docker容器。
javax.servlet.ServletException: Servlet execution threw an exception
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
详细信息
java.lang.IncompatibleClassChangeError: Class javax.ws.rs.core.Response$Status does not implement the requested interface javax.ws.rs.core.Response$StatusType
在网上对此进行了一些调查,结果显示很多人在使用冲突的球衣罐时遇到问题。我们不应该有这个问题,因为我们使用docker for mac ...而这适用于跨多个版本的docker的其他人的机器。
我已经多次擦除并重新安装了docker,在每次重启之间重启我的机器。我使用的是与它工作的机器相同的版本。
我在OSX Sierra 10.12.2
泊坞窗图片基于tomcat:8.5.9-jre8-alpine
它会将相关的.war
复制到$CATALINA_HOME/webapps/
,将一个log4j .jar
复制到$CATALINA_HOME/lib/
以及两个.properties文件。'
这台特定的机器上有什么东西可以干扰容器吗?
Dockerfile如下
FROM tomcat:8.5.9-jre8-alpine@sha256:780c0fc47cf5e212bfa79a379395444a36bbd67f0f3cd9d649b90a74a1a7be20
ENV JAVA_OPTS="-Xms2048m -Xmx2048m"
WORKDIR $CATALINA_HOME
COPY ./target/lib/* $CATALINA_HOME/lib/
COPY ./target/<appname>.war $CATALINA_HOME/webapps/
EXPOSE 8080
CMD ["catalina.sh", "run"]
答案 0 :(得分:0)
检查所有卷,在这种情况下最关键的卷是从〜/ .m2安装到容器〜/ .m2 ..这可以解释你的问题。
除此之外,只要您使用相同的图像AND,它就无法在一台机器上工作,而在另一台机器上工作则没有意义:
a)WAR文件的编译不会发生在probelematic计算机上(很可能是本地maven / m2)问题
b)你没有在入口点做任何疯狂的事情真的伤害了范式(我不这么认为)c)您将本地m2安装到容器m2中,从而共享库
我们运行了很多带有不同战争应用程序的tomcat容器,正如您所期望的那样,它们绝对可以跨平台运行。
提示:要避免a)使用图像java env 始终在图像中构建