java - war文件如何在docker容器的tomcat中创建目录

标签 java docker tomcat dockerfile tomcat8

我正在尝试部署一个 java api,它基本上在 docker 容器内的/tomcat/webapps/目录中带有一个 .war fie。我能够从位于的 Artifactory 复制 .​​war 文件。所以现在docker容器里面的tomcat结构是: tomcat/webapps/api.war
事情是,在我将 WAR 文件复制到那里之后,我不知道 java 和 tomcat 是如何工作的,以便 WAr 文件使用 META-INF , WEB-INF 目录在 api 下创建 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"]

这完美地工作并且 war 被复制到 tomcat 目录下并且 catalina.sh 成功运行。我需要知道 war 是如何在这一切之后创建目录结构的。现在我只有 war 文件。

谢谢!!

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: start: 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)

最佳答案

默认情况下,当您启动服务器时,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 构建镜像,您可以使用 official image 作为基础镜像。来自 docker hub

关于java - war文件如何在docker容器的tomcat中创建目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51750096/

相关文章:

java - 在调用两种方法之间随机选择

c# - 使用 docker-compose 运行 docker 镜像

java - 使用 Visual Studio Code 将 Java Web 应用程序部署到 Tomcat

tomcat - 每次 Tomcat 服务启动时通过批处理文件做一些事情

java - 使用 Jsoup 保留行

java - MONDRIAN:刷新维度缓存

java - 无法满足从 com.lmax.disruptor 3.2.0 到 package sun.misc 0.0.0 的依赖

ruby - 将Webservice打包到Docker镜像后不起作用

docker - Docker产品与开发环境的差异

ssl - Firefox 访问 Tomcat 站点时出现 SSL_ERROR_RX_UNKNOWN_ALERT 错误