簡體   English   中英

tomcat docker-compose 無法訪問共享卷

[英]tomcat docker-compose cannot access to shared volume

我正在嘗試在 tomcat docker 容器上部署戰爭。 Tomcat 管理器默認可通過列出的 http 端口訪問。 我不想要這種行為。 為了避免這種情況,我已經完成了 ROOT.xml 上下文文件,如此處所述https://stackoverflow.com/a/7706950/3143009

ROOT.xml 通過 docker 卷共享並包含上下文定義:

<Context docBase="/usr/tomcat/custom-webapp/app.war" reloadable="true" />

在我看來,一切都是正確的,但是當我嘗試啟動 tomcat 容器時,會出現 FileNotFindException,告訴 tomcat 找不到 /usr/tomcat/custom-webapp/app.war(/usr/tomcat/custom-webapp 也是包含 app.war 文件的共享卷)。

我的 docker-compose 文件:

version : '3'
    tomcat:
        image: tomcat:9.0.27-jdk8-openjdk
        hostname: tomcat
        restart: on-failure
        ports:
        - 10000:8080
        volumes:
        - ./data/logs/:/usr/local/tomcat/logs/
        - ./data/context-ROOT.xml:/usr/local/tomcat/conf/Catalina/localhost/ROOT.xml
        - ./data/custom-webapp:/usr/local/tomcat/custom-webapp 

我確定 app.war 文件已安裝在容器中。 當我進入容器或執行docker-compose run tomcat ls /usr/local/tomcat/custom-webapp時,我可以看到它。 但在啟動時,tomcat 似乎找不到該文件。 這對我來說很奇怪。

有誰知道為什么 tomcat 容器無法訪問 app.war 文件?

下面的錯誤堆棧跟蹤。

> tomcat_1    | 25-Oct-2019 14:43:55.287 INFO [main]
> org.apache.catalina.startup.HostConfig.deployDescriptor Deploying
> deployment descriptor
> [/usr/local/tomcat/conf/Catalina/localhost/ROOT.xml] tomcat_1    |
> 25-Oct-2019 14:43:55.307 WARNING [main]
> org.apache.catalina.startup.HostConfig.deployDescriptor Deployment of
> deployment descriptor
> [/usr/local/tomcat/conf/Catalina/localhost/ROOT.xml] with an external
> docBase means the directory [/usr/local/tomcat/webapps/ROOT] in the
> appBase will be ignored tomcat_1    | 25-Oct-2019 14:43:55.331 SEVERE
> [main] org.apache.catalina.startup.ContextConfig.beforeStart Exception
> fixing docBase for context [] tomcat_1    |  
> java.io.FileNotFoundException: /usr/tomcat/custom-webapp/mytower.war
> (No such file or directory) tomcat_1    |           at
> java.io.FileInputStream.open0(Native Method) tomcat_1    |          
> at java.io.FileInputStream.open(FileInputStream.java:195) tomcat_1   
> |           at
> java.io.FileInputStream.<init>(FileInputStream.java:138) tomcat_1    |
> at java.io.FileInputStream.<init>(FileInputStream.java:93) tomcat_1   
> |           at
> sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:90)
> tomcat_1    |           at
> sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:188)
> tomcat_1    |           at
> org.apache.catalina.startup.ExpandWar.expand(ExpandWar.java:90)
> tomcat_1    |           at
> org.apache.catalina.startup.ContextConfig.fixDocBase(ContextConfig.java:615)
> tomcat_1    |           at
> org.apache.catalina.startup.ContextConfig.beforeStart(ContextConfig.java:747)
> tomcat_1    |           at
> org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:303)
> tomcat_1    |           at
> org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
> tomcat_1    |           at
> org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:423)
> tomcat_1    |           at
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:182)
> tomcat_1    |           at
> org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)
> tomcat_1    |           at
> org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)
> tomcat_1    |           at
> org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
> tomcat_1    |           at
> org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:631)
> tomcat_1    |           at
> org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1831)
> tomcat_1    |           at
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
> tomcat_1    |           at
> java.util.concurrent.FutureTask.run(FutureTask.java:266) tomcat_1    |
> at
> org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
> tomcat_1    |           at
> java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
> tomcat_1    |           at
> org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:526)
> tomcat_1    |           at
> org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:425)
> tomcat_1    |           at
> org.apache.catalina.startup.HostConfig.start(HostConfig.java:1576)
> tomcat_1    |           at
> org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:309)
> tomcat_1    |           at
> org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
> tomcat_1    |           at
> org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:423)
> tomcat_1    |           at
> org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:366)
> tomcat_1    |           at
> org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:936)
> tomcat_1    |           at
> org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:841)
> tomcat_1    |           at
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
> tomcat_1    |           at
> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384)
> tomcat_1    |           at
> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374)
> tomcat_1    |           at
> java.util.concurrent.FutureTask.run(FutureTask.java:266) tomcat_1    |
> at
> org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
> tomcat_1    |           at
> java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
> tomcat_1    |           at
> org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909)
> tomcat_1    |           at
> org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
> tomcat_1    |           at
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
> tomcat_1    |           at
> org.apache.catalina.core.StandardService.startInternal(StandardService.java:421)
> tomcat_1    |           at
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
> tomcat_1    |           at
> org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930)
> tomcat_1    |           at
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
> tomcat_1    |           at
> org.apache.catalina.startup.Catalina.start(Catalina.java:633) tomcat_1
> |           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native
> Method) tomcat_1    |           at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> tomcat_1    |           at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> tomcat_1    |           at
> java.lang.reflect.Method.invoke(Method.java:498) tomcat_1    |        
> at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:344)
> tomcat_1    |           at
> org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:475)
> tomcat_1    | 25-Oct-2019 14:43:56.054 SEVERE [main]
> org.apache.catalina.startup.HostConfig.deployDescriptor Error
> deploying deployment descriptor
> [/usr/local/tomcat/conf/Catalina/localhost/ROOT.xml] tomcat_1    |  
> java.lang.IllegalStateException: Error starting child tomcat_1    |   
> at
> org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:720)
> tomcat_1    |           at
> org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)
> tomcat_1    |           at
> org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
> tomcat_1    |           at
> org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:631)
> tomcat_1    |           at
> org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1831)
> tomcat_1    |           at
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
> tomcat_1    |           at
> java.util.concurrent.FutureTask.run(FutureTask.java:266) tomcat_1    |
> at
> org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
> tomcat_1    |           at
> java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
> tomcat_1    |           at
> org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:526)
> tomcat_1    |           at
> org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:425)
> tomcat_1    |           at
> org.apache.catalina.startup.HostConfig.start(HostConfig.java:1576)
> tomcat_1    |           at
> org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:309)
> tomcat_1    |           at
> org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
> tomcat_1    |           at
> org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:423)
> tomcat_1    |           at
> org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:366)
> tomcat_1    |           at
> org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:936)
> tomcat_1    |           at
> org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:841)
> tomcat_1    |           at
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
> tomcat_1    |           at
> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384)
> tomcat_1    |           at
> org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374)
> tomcat_1    |           at
> java.util.concurrent.FutureTask.run(FutureTask.java:266) tomcat_1    |
> at
> org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
> tomcat_1    |           at
> java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
> tomcat_1    |           at
> org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909)
> tomcat_1    |           at
> org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
> tomcat_1    |           at
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
> tomcat_1    |           at
> org.apache.catalina.core.StandardService.startInternal(StandardService.java:421)
> tomcat_1    |           at
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
> tomcat_1    |           at
> org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930)
> tomcat_1    |           at
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
> tomcat_1    |           at
> org.apache.catalina.startup.Catalina.start(Catalina.java:633) tomcat_1
> |           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native
> Method) tomcat_1    |           at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> tomcat_1    |           at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> tomcat_1    |           at
> java.lang.reflect.Method.invoke(Method.java:498) tomcat_1    |        
> at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:344)
> tomcat_1    |           at
> org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:475)
> tomcat_1    |   Caused by: org.apache.catalina.LifecycleException:
> Failed to start component
> [org.apache.catalina.webresources.StandardRoot@2a556333] tomcat_1    |
> at
> org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440)
> tomcat_1    |           at
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
> tomcat_1    |           at
> org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4800)
> tomcat_1    |           at
> org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4935)
> tomcat_1    |           at
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
> tomcat_1    |           at
> org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)
> tomcat_1    |           ... 37 more tomcat_1    |   Caused by:
> java.lang.IllegalArgumentException: The main resource set specified
> [/usr/tomcat/custom-webapp/mytower.war] is not valid tomcat_1    |    
> at
> org.apache.catalina.webresources.StandardRoot.createMainResourceSet(StandardRoot.java:752)
> tomcat_1    |           at
> org.apache.catalina.webresources.StandardRoot.startInternal(StandardRoot.java:709)
> tomcat_1    |           at org.apache

您沒有使用卷,而是使用bind-mounts 這意味着本地主機路徑被掛載到容器中,並且./data/custom-webapp的內容將替換/usr/local/tomcat/custom-webapp目錄的內容。

因此,您的ROOT.xml應該如下所示:

<Context docBase="/usr/local/tomcat/custom-webapp/app.war" reloadable="true" />

並且app.war應該在您主機上的./data/custom-webapp目錄中。

謝謝@michalk。 這是我一個粗心大意的錯誤。

Tomcat 現在可以找到戰爭了。 在 tomcat 日志中,我可以看到INFO [main] org.apache.catalina.startup.HostConfig.deployDescriptor Deployment of deployment descriptor [/usr/local/tomcat/conf/Catalina/localhost/ROOT.xml] has finished in [188] ms

我現在有另一個問題。

我預計 app.war 文件會被 tomcat 解壓縮。 即使 tomcat 啟動時沒有錯誤,情況也並非如此。 但是當我在 tomcat 運行時用另一場戰爭替換戰爭時,戰爭被解包並部署。

為什么 tomcat 在指定自定義上下文 ROOT 文件時無法在啟動時部署應用程序?

一些想法?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM