在tomcat docker容器中部署Java应用程序

问题描述:

我正在尝试将.war,.aar,.xml和.properties文件部署到tomcat docker容器。我在Dockerfile下面使用了基础tomcat docker镜像。在tomcat docker容器中部署Java应用程序

FROM tomcat:7 
RUN rm -rf /usr/local/tomcat/webapps/ROOT 
COPY test-3.0.war /usr/local/tomcat/webapps/ROOT.war 
COPY testone-3.0.aar /usr/local/tomcat/webapps/axis2/WEB-INF/services/ 
COPY ./conf/context.xml /usr/local/tomcat/conf/ 
COPY ./conf/server.xml /usr/local/tomcat/conf/ 
CMD ["catalina.sh", "run"] 

一切按预期工作到现在为止。它提取战争文件并启动容器内的应用程序。

但是现在我需要添加/编辑“/ usr/local/tomcat/webapps/ROOT/WEB-INF/classes /”和“/ usr/local/tomcat/webapps/ROOT/js“喜欢这个。

COPY ./conf/applicationurl.properties /usr/local/tomcat/webapps/ROOT/WEBINF/classes/ 
COPY ./conf/memcache.properties /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/ 
COPY ./conf/um.properties /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/ 
COPY ./conf/pe.properties /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/ 
COPY ./conf/check.js /usr/local/tomcat/webapps/ROOT/js 

将这些文件复制到正在运行的tomcat容器中的最佳方法是什么?我试图用上面的Dockerfile作为基础镜像构建一个更多的Docker镜像,并将上述文件复制到容器内的目标文件夹中,但它会删除所有提取的war文件夹/文件,并且它只复制/ usr/local/tomcat中的文件/ webapps目录。

我只需要添加一些属性文件,它不应该删除webapps目录内现有的解压缩文件夹。

有人可以帮我解决这个问题吗?

+0

更编程方法是来准备你的java应用程序,所以你可以用-D标志或类似的东西指向配置所在的位置。然后,您可以在复制war文件后将-D标志附加到CATALINA_OPTS变量 –

+0

另一种方法是在启动服务器之前将属性构建到jar中并将其部署到tomcat/lib。 –

+0

感谢您的建议。但我需要通过在docker中使用上述场景来完成此操作。 – Nanab4u

可以通过使用可以使用nohup调用的后脚本然后调用tomcat运行来解决。

postscript.sh有post操作 - 将复制命令列表移动到postscript.sh在复制命令之前,在脚本中包含一些等待逻辑,直到tomcat启动。 (它可以只是睡了几秒钟,甚至用grep tomcat的日志,搜索服务器启动)

#postscript.sh 
    sleep 1000 
    copy commands 

创建使用nohup的调用后脚本启动脚本,然后调用Tomcat的运行

#start.sh 
nohup postscript.sh & catalina.sh run 

然后更改CMD以在dockerfile中运行start.sh。还要将postscript.sh和start.sh文件复制到容器中的某个位置(例如/ tmp)。

#....other contents 
    COPY start.sh /tmp/start.sh 
    COPY postscript.sh /tmp/postscript.sh 
    CMD ["/tmp/start.sh"] 

希望这有助于。

+0

Thanks.But我试图运行该图像时出现以下错误。 “docker:来自守护进程的错误响应:容器命令'/tmp/start.sh'不能调用” “。 你有什么想法吗? – Nanab4u

+0

检查start.sh是否被复制到/ tmp文件夹。您可以通过在容器上运行bash来检查/ tmp的内容。 – sandy

+0

构建图像时,它正在复制到特定位置。但是,当使用docker run启动容器时,容器本身不会启动并抛出前面提到的错误。因此无法向它发起冲击。 – Nanab4u

另一种选择是仅仅解压缩war文件(您可以重命名为zip,因为它确实是zip文件)。

所以:

  1. 解压战争
  2. 做出必要的子文件夹中的所有修改。
  3. 重新拉链
  4. 重命名到.WAR
  5. 部署按正常

我经由DockerFile脚本操纵war。就我而言,它的Geoserver部署+添加插件jars/WEB-INF/lib

总之

,解压后是这样的: unzip geoserver-2.10.2.war -d geoserver_war/

希望帮助别人