war文件如何在docker容器上的tomcat内部创建目录

时间:2018-08-08 15:10:44

标签: java docker tomcat dockerfile tomcat8

我正在尝试部署一个Java api,该api在docker容器内的/ tomcat / webapps /目录中基本上带有.war fie。我能够从其中的Artifactory复制.war文件。因此,现在docker容器中的tomcat结构为: tomcat / webapps / api.war
问题是,在我将WAR文件复制到那里之后,我不知道java和tomcat是如何工作的,以便WAr文件使用api下的META-INF,WEB-INF目录创建api的目录结构目录。 api.war如何创建api目录?我以为是在启动catlina.sh之后,但显然不是。这是我在dockerfile末尾拥有的dockerfile的一部分(上一部分并不重要,因为tomcat官方dockerfile构建了该映像):

RUN curl -u user:pass -O "http://artifactory.xxx.com:443/artifactory/xx-api/xxapi.war"
RUN mv /usr/local/tomcat/xxapi.war /usr/local/tomcat/webapps/ 
RUN rm -rf /usr/local/tomcat/webapps/docs && rm -rf /usr/local/tomcat/webapps/examples \
&& rm -rf /usr/local/tomcat/webapps/host-manager $$ rm -rf /usr/local/tomcat/webapps/manager
RUN ls -la /usr/local/tomcat/webapps/
EXPOSE 8080
CMD ["catalina.sh", "run"]

这很好用,并且战争被复制到tomcat目录下,并且catalina.sh成功运行。我需要知道战争在所有这些之后如何创建目录结构。现在我只有战争档案。

谢谢!

enter image description here

enter image description here

08-Aug-2018 16:26:51.927严重[localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR 部署Web应用程序时出错 存档[/usr/local/tomcat/webapps/gp_searchapi.war]  java.lang.IllegalStateException:ContainerBase.addChild:启动:org.apache.catalina.LifecycleException:无法启动组件[StandardEngine [Catalina] .StandardHost [localhost] .StandardContext [/ gp_searchapi]]         在org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:758)         在org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730)         在org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)         在org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:985)         在org.apache.catalina.startup.HostConfig $ DeployWar.run(HostConfig.java:1857)         在java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:511)         在java.util.concurrent.FutureTask.run(FutureTask.java:266)         在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)         在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)         在java.lang.Thread.run(Thread.java:748)

1 个答案:

答案 0 :(得分:0)

默认情况下,当您启动服务器时,tomcat将解压缩war文件以进行部署。

从外观上看,您仅构建了docker映像,并且正在映像构建内部执行RUN ls -la /usr/local/tomcat/webapps/

因此,当您启动最近生成的映像时,tomcat将启动(因为您将默认CMD定义为exec catalina.sh run)。

您可以使用docker run命令来开始新映像:

docker run -it --rm -p 8080:8080 <image_name>:<image_version>

您可以使用以下方式查看您的tomcat日志

docker logs container_name

还要注意,您不需要使用tomcat构建映像,您可以将来自docker hub的official image用作基础映像