在 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分离部署MySQLNginx+Tomcat复制共享