【问题标题】:Deployed war file to docker image cannot be accessed from TOMCAT 8 in Ubuntu 16.04无法从 Ubuntu 16.04 中的 TOMCAT 8 访问部署到 docker 映像的 war 文件
【发布时间】:2017-08-10 14:11:42
【问题描述】:

我的 Docker 文件

# Pull base image
  FROM tomcat:8-jre8

# Maintainer
  MAINTAINER "Ravindu <rav@info.com">

# Copy to images tomcat path
  ADD /mobile.war /usr/local/tomcat/webapps/

docker镜像是通过运行maven ant插件构建的,镜像创建成功,没有任何问题。但是当我运行创建的图像时,tomcat 服务器正常启动并在堆栈跟踪上抛出以下错误

19-Mar-2017 07:33:11.517 SEVERE [localhost-startStop-1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start: 
 org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/mobile]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:162)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:753)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:729)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:940)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1816)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.webresources.StandardRoot@3ec80848]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:162)
    at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4969)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5099)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    ... 10 more
Caused by: org.apache.catalina.LifecycleException: Failed to initialize component [org.apache.catalina.webresources.JarResourceSet@1c19c6e4]
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:135)
    at org.apache.catalina.webresources.StandardRoot.startInternal(StandardRoot.java:707)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    ... 13 more
Caused by: java.lang.IllegalArgumentException: java.util.zip.ZipException: zip file is empty
    at org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.initInternal(AbstractSingleArchiveResourceSet.java:113)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
    ... 16 more
Caused by: java.util.zip.ZipException: zip file is empty
    at java.util.zip.ZipFile.open(Native Method)
    at java.util.zip.ZipFile.<init>(ZipFile.java:219)
    at java.util.zip.ZipFile.<init>(ZipFile.java:149)
    at java.util.jar.JarFile.<init>(JarFile.java:166)
    at java.util.jar.JarFile.<init>(JarFile.java:103)
    at org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.initInternal(AbstractSingleArchiveResourceSet.java:110)
    ... 17 more

19-Mar-2017 07:33:11.519 SEVERE [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive /usr/local/tomcat/webapps/mobile.war
 java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/mobile]]
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:757)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:729)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:940)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1816)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

虽然我可以通过获取docker容器IP来访问tomcat服务器登陆页面,但即使发生这些错误,我想要的war文件路由/mobile也无法访问并抛出404。

注意 - 我什至尝试不使用 maven ant 插件直接使用 docker 文件创建图像,但运行创建的 docker 图像时问题仍然存在。

注意 - 虽然它会引发 Zip 文件空错误,但在我的 ubuntu 机器中完全提取了 mobile.war 文件,没有任何错误。

NB - 我也尝试使用 docker toolbox 命令行工具在我的 Windows 机器上执行此操作,方法是创建基于相同 Dockerfile 的映像,并且我能够通过以下方式成功部署和访问我的 war 文件/mobile 没有任何问题。

注意 - mobile.war 文件是使用默认的 maven war 插件创建的,我正在使用 IntelliJ IDEA 进行开发。

EDIT - 添加完整堆栈跟踪

WARNING: Error loading config file:/home/ravindu/.docker/config.json - stat /home/ravindu/.docker/config.json: permission denied
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/lib/jvm/java-8-openjdk-amd64/jre
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
22-Mar-2017 10:50:17.386 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:        Apache Tomcat/8.0.42
22-Mar-2017 10:50:17.395 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Mar 8 2017 19:58:16 UTC
22-Mar-2017 10:50:17.395 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number:         8.0.42.0
22-Mar-2017 10:50:17.395 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
22-Mar-2017 10:50:17.395 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            4.4.0-66-generic
22-Mar-2017 10:50:17.395 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
22-Mar-2017 10:50:17.395 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /usr/lib/jvm/java-8-openjdk-amd64/jre
22-Mar-2017 10:50:17.395 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           1.8.0_121-8u121-b13-1~bpo8+1-b13
22-Mar-2017 10:50:17.396 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation
22-Mar-2017 10:50:17.396 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /usr/local/tomcat
22-Mar-2017 10:50:17.396 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /usr/local/tomcat
22-Mar-2017 10:50:17.396 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties
22-Mar-2017 10:50:17.396 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
22-Mar-2017 10:50:17.396 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
22-Mar-2017 10:50:17.396 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
22-Mar-2017 10:50:17.396 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.endorsed.dirs=/usr/local/tomcat/endorsed
22-Mar-2017 10:50:17.396 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/usr/local/tomcat
22-Mar-2017 10:50:17.396 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/usr/local/tomcat
22-Mar-2017 10:50:17.397 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
22-Mar-2017 10:50:17.397 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded APR based Apache Tomcat Native library 1.2.12 using APR version 1.5.1.
22-Mar-2017 10:50:17.397 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
22-Mar-2017 10:50:17.445 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized (OpenSSL 1.1.0e  16 Feb 2017)
22-Mar-2017 10:50:17.915 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-apr-8080"]
22-Mar-2017 10:50:17.939 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-apr-8009"]
22-Mar-2017 10:50:17.940 INFO [main] org.apache.catalina.startup.Catalina.load Initialization processed in 2425 ms
22-Mar-2017 10:50:18.034 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service Catalina
22-Mar-2017 10:50:18.034 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.0.42
22-Mar-2017 10:50:18.131 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive /usr/local/tomcat/webapps/mobile.war
22-Mar-2017 10:50:19.556 SEVERE [localhost-startStop-1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start: 
 org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/mobile]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:162)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:753)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:729)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:940)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1816)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.webresources.StandardRoot@3954f4bc]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:162)
    at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4969)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5099)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    ... 10 more
Caused by: org.apache.catalina.LifecycleException: Failed to initialize component [org.apache.catalina.webresources.JarResourceSet@3b4859b1]
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:135)
    at org.apache.catalina.webresources.StandardRoot.startInternal(StandardRoot.java:707)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    ... 13 more
Caused by: java.lang.IllegalArgumentException: java.util.zip.ZipException: zip file is empty
    at org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.initInternal(AbstractSingleArchiveResourceSet.java:113)
    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
    ... 16 more
Caused by: java.util.zip.ZipException: zip file is empty
    at java.util.zip.ZipFile.open(Native Method)
    at java.util.zip.ZipFile.<init>(ZipFile.java:219)
    at java.util.zip.ZipFile.<init>(ZipFile.java:149)
    at java.util.jar.JarFile.<init>(JarFile.java:166)
    at java.util.jar.JarFile.<init>(JarFile.java:103)
    at org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.initInternal(AbstractSingleArchiveResourceSet.java:110)
    ... 17 more

22-Mar-2017 10:50:19.597 SEVERE [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Error deploying web application archive /usr/local/tomcat/webapps/mobile.war
 java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/mobile]]
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:757)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:729)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:940)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1816)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

22-Mar-2017 10:50:19.618 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive /usr/local/tomcat/webapps/mobile.war has finished in 1,467 ms
22-Mar-2017 10:50:19.633 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /usr/local/tomcat/webapps/host-manager
22-Mar-2017 10:50:20.542 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /usr/local/tomcat/webapps/host-manager has finished in 909 ms
22-Mar-2017 10:50:20.543 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /usr/local/tomcat/webapps/docs
22-Mar-2017 10:50:20.595 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /usr/local/tomcat/webapps/docs has finished in 52 ms
22-Mar-2017 10:50:20.596 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /usr/local/tomcat/webapps/manager
22-Mar-2017 10:50:20.632 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /usr/local/tomcat/webapps/manager has finished in 36 ms
22-Mar-2017 10:50:20.636 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /usr/local/tomcat/webapps/ROOT
22-Mar-2017 10:50:20.697 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /usr/local/tomcat/webapps/ROOT has finished in 60 ms
22-Mar-2017 10:50:20.697 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /usr/local/tomcat/webapps/examples
22-Mar-2017 10:50:21.239 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /usr/local/tomcat/webapps/examples has finished in 542 ms
22-Mar-2017 10:50:21.245 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8080"]
22-Mar-2017 10:50:21.284 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-apr-8009"]
22-Mar-2017 10:50:21.292 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 3351 ms

即使参考了很多 SO 问题,也找不到任何确切的线索来解决这个问题。

【问题讨论】:

  • 你确定WAR文件真的被复制到容器中了吗?您正在使用 /mobile.war 作为本地 WAR 文件 - 您确定该文件存在于您的主机系统的根文件夹中吗?您确定不想改用 ./mobile.war 吗?
  • 我可以在容器中看到我的 mobile.war 文件。它的提取没有任何问题!
  • 你能尝试改变tomcat版本,比如“FROM tomcat:8.0.20-jre8”。不确定它是否会有所帮助,但试一试并不疯狂。
  • 非常感谢@SanketD 的提示!但是还没有解决!同样的错误依然存在!

标签: java ubuntu docker tomcat8


【解决方案1】:

在这种情况下可能有两个问题:

  1. 在容器中复制文件如*.war,*.zip,.*.tar.gz 的最佳方法不是使用ADD,而是必须使用COPY,因为COPYADD 有一点区别。当您使用ADD 时,它会将文件置于Images 中的提取模式中。如果它在这些.war,.zip,.*.tar.gz 中的任何一个中,如果使用COPY,那么它只会像cp 命令一样在Images 中复制。所以最好的做法是对这些文件使用COPY,不用担心它会损坏。
  2. 正如您在 cmets "bash: jar: command not found" 中提到的,可能是您的容器内的 java 未在 $PATH 变量中设置或 JAVA_HOME 没有适当的权限。

希望这会有所帮助。谢谢!

【讨论】:

  • 感谢您的回答!认为 ADD 可以做的不仅仅是 COPY。在添加 COPY 之间并没有解决问题。该问题可能与您的第二点有关。将进行更多调试并返回!
  • 太棒了!给你更多提示。在将其放入 docker 之前,请尝试在您的物理主机上运行 mobile.war。您可以确定究竟是什么造成了战争或码头问题?
  • 问题似乎出在docker上!它在物理主机中运行良好!
  • 在您的容器中添加JAVA/jdk/jre 并在您的.bash_profile 中添加JAVA_HOME,然后在启动您的tomcat 之前验证javac。我认为问题与JAVA 相关,也为JAVA 目录提供适当的权限。谢谢!
  • 问题肯定出在我本地机器的java版本上。我在我的 AWS linux 机器上做了同样的过程,它没有任何问题。感谢您的帮助!
【解决方案2】:

您能否检查mobile.war 在复制到容器时是否损坏?我看到你提到你可以在主机上提取它,但可能整个文件没有被正确复制。

使用 docker exec -it container-name bash 进入您的容器,然后转到/usr/local/tomcat/webapps/ 并检查jar xvf mobile.war

【讨论】:

  • 在容器内运行会抛出“bash: jar: command not found”错误!
  • 您可以尝试删除 java、tomcat 和您的自定义图像,然后重新构建它吗?
  • 你的意思是tomcat的基础docker镜像吗?如果是这样,在发布此问题之前先尝试过!没有进步!
猜你喜欢
  • 2012-06-05
  • 2017-04-04
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 2012-09-28
  • 1970-01-01
相关资源
最近更新 更多