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

Posted

技术标签:

【中文标题】在 tomcat docker 容器中部署 Java 应用程序【英文标题】:Deploying Java application in tomcat docker container 【发布时间】:2016-10-06 23:57:18 【问题描述】:

我正在尝试将 .war、.aar、.xml 和 .properties 文件部署到 tomcat docker 容器。我在 Dockerfile 下面使用了基本的 tomcat docker 映像。

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"]

到目前为止,一切都按预期进行。它提取 war 文件并在容器内启动应用程序。

但是现在我需要在“/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 目录中现有的提取文件夹。

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

【问题讨论】:

一种更加程序化的方法是准备您的 java 应用程序,以便您可以使用 -D 标志或类似的东西指向配置所在的位置。然后,您可以在复制您的战争文件后将您的 -D 标志附加到 CATALINA_OPTS 变量 另一种方法是将属性构建到 jar 中,然后在启动服务器之前将其部署到 tomcat/lib。 感谢您的建议。但我需要通过在 docker 中使用上述场景来完成此操作。 你是如何最终解决这个问题的?我现在有确切的问题。部署geoserver war,然后需要访问WEB-INF等,添加mysql db plugin等插件 【参考方案1】:

可以通过post脚本来解决,可以使用nohup调用,然后调用tomcat run。

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

   #postscript.sh
   sleep 1000
   copy commands

创建一个启动脚本,使用 nohup 调用 post 脚本,然后调用 tomcat run

 #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"]

希望这会有所帮助。

【讨论】:

谢谢。但我在尝试运行该图像时遇到以下错误。 “docker:来自守护程序的错误响应:无法调用容器命令'/tmp/start.sh'”。你对此有什么想法吗? 检查 start.sh 是否复制到 /tmp 文件夹。您可以通过在容器上运行 bash 来检查 /tmp 的内容。 在构建映像时,它正在复制到特定位置。但是当使用 docker run 启动容器时,容器本身没有启动并抛出上述错误。因此无法进入它。 您可以在 docker 映像上运行 bash,然后检查内容并查看文件是否正确复制。尝试“docker run -it dockerimagename bash”【参考方案2】:

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

所以:

    解压战争 对子文件夹进行所有需要的修改。 重新压缩 重命名为.war 正常部署

我正在通过DockerFile 脚本操作war。就我而言,它的部署Geoserver + 添加插件jars/WEB-INF/lib

简而言之,像这样解压缩: unzip geoserver-2.10.2.war -d geoserver_war/

希望对某人有所帮助

【讨论】:

以上是关于在 tomcat docker 容器中部署 Java 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Docker容器部署tomcat出现中文乱码

Docker分离部署MySQLNginx+Tomcat复制共享

Docker容器和本机之间的文件传输 使用Docker部署Tomcat项目

Docker部署网站之后映射域名

Docker部署网站之后映射域名

docker容器