Tomcat 7权限尽管有权限,但仍拒绝部署war文件

问题描述

将战争文件复制到webapps文件夹中,部署失败,并且在日志中出现此错误

Oct 09,2020 7:09:51 AM org.apache.catalina.startup.ContextConfig beforeStart
SEVERE: Exception fixing docBase for context [/myapp]
java.io.FileNotFoundException: /var/lib/tomcat/webapps/myapp.war (Permission denied)

我相信webapps文件夹和tomcat:tomcat /755文件myapp.war)都具有正确的权限(tomcat:tomcat / 644),但此错误失败。

当我手动(使用jar xvf myapp.war解压缩war文件时,它可以工作。 如果我使用管理器应用程序加载战争文件,它也可以正常工作。

我有一个具有相同权限的war文件,可以正确部署,因此似乎与war文件本身有关,但是此war文件已正确部署在我的本地服务器上。

所以我真的很困惑。

不确定要检查什么。

编辑:我的tomcat目标用户具有nologin权限。如果我以root身份手动解压缩war文件,则将内容设置为tomcat:tomcat的ownership,然后重新打包war文件,然后它将自动部署。

但是我试图提取文件并将其带回本地,然后将其scp返回到tomcat服务器,并且它不再起作用。

因此,似乎有些带有权限的东西,但不清楚它是什么。

请注意,我要从中发送文件的源服务器以Tomcat用户的身份在Docker上运行。

我在其中构建war文件的本地系统是Mac OSX计算机。在Dockerfile中使用copY时,这些文件最初是由root拥有的,但是在映像构建中,我将onwership更改回tomcat

为清楚起见,我正在构建包含war文件的Docker映像。那很好。然后,当将该.war文件(通过scp)迁移到另一个VM时,它没有部署在目标上,并且出现上述错误

完整跟踪:

SEVERE: Exception fixing docBase for context [/myapp]
java.io.FileNotFoundException: /var/lib/tomcat/webapps/myapp.war (Permission denied)
    at java.base/java.io.RandomAccessFile.open0(Native Method)
    at java.base/java.io.RandomAccessFile.open(RandomAccessFile.java:347)
    at java.base/java.io.RandomAccessFile.<init>(RandomAccessFile.java:261)
    at java.base/java.io.RandomAccessFile.<init>(RandomAccessFile.java:216)
    at java.base/java.util.zip.ZipFile$Source.<init>(ZipFile.java:1206)
    at java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1172)
    at java.base/java.util.zip.ZipFile$CleanableResource.<init>(ZipFile.java:717)
    at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:237)
    at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:167)
    at java.base/java.util.jar.JarFile.<init>(JarFile.java:347)
    at java.base/sun.net.www.protocol.jar.URLJarFile.<init>(URLJarFile.java:103)
    at java.base/sun.net.www.protocol.jar.URLJarFile.getJarFile(URLJarFile.java:72)
    at java.base/sun.net.www.protocol.jar.JarFileFactory.get(JarFileFactory.java:99)
    at java.base/sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:125)
    at java.base/sun.net.www.protocol.jar.JarURLConnection.getJarFile(JarURLConnection.java:92)
    at org.apache.catalina.startup.ExpandWar.expand(ExpandWar.java:111)
    at org.apache.catalina.startup.ContextConfig.fixDocBase(ContextConfig.java:727)
    at org.apache.catalina.startup.ContextConfig.beforeStart(ContextConfig.java:852)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:390)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:388)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:144)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:899)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:875)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1092)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1984)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
    at java.base/java.lang.Thread.run(Thread.java:832)

解决方法

它与 Docker 中的用户 UID/GUID 有关。不知何故,该文件由相同的用户名拥有,但它在此容器中具有不同的 UUID,这将事情搞砸了。 在确保同一用户在源和目标中具有相同的 UUID 后,问题就消失了。