Java 尽管有权限,部署war文件的Tomcat 7权限被拒绝

Java 尽管有权限,部署war文件的Tomcat 7权限被拒绝,java,tomcat,tomcat7,Java,Tomcat,Tomcat7,将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 den

将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
),但由于此错误而失败

当我手动解包war文件时(使用
jarxvf myapp.war
),它可以工作。 如果我使用manager应用程序加载war文件,它也可以工作

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

所以我真的很困惑

不知道还要检查什么

编辑:我的tomcat目标用户拥有
nologin
权限。如果我手动将war文件解包为root,将ownership设置为
tomcat:tomcat
,然后重新打包war文件,它就会自动部署

但我试图提取文件并将其带回本地,然后将scp带回tomcat服务器,但它不再工作

因此,权限似乎有些可疑,但不清楚它是什么

请注意,我从中发送文件的源服务器作为tomcat用户在Docker上运行

我构建war文件的本地系统是MacOSX机器。在Dockerfile中使用COPY时,文件最初由root所有,但我在映像构建中将onwership更改回
tomcat

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

完整跟踪:

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)

严重:修复上下文的docBase[/myapp]异常
java.io.FileNotFoundException:/var/lib/tomcat/webapps/myapp.war(权限被拒绝)
位于java.base/java.io.RandomAccessFile.open0(本机方法)
位于java.base/java.io.RandomAccessFile.open(RandomAccessFile.java:347)
位于java.base/java.io.RandomAccessFile。(RandomAccessFile.java:261)
位于java.base/java.io.RandomAccessFile。(RandomAccessFile.java:216)
位于java.base/java.util.zip.ZipFile$Source。(ZipFile.java:1206)
位于java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1172)
位于java.base/java.util.zip.ZipFile$CleanableResource(ZipFile.java:717)
位于java.base/java.util.zip.ZipFile(ZipFile.java:237)
位于java.base/java.util.zip.ZipFile(ZipFile.java:167)
位于java.base/java.util.jar.JarFile.(JarFile.java:347)
位于java.base/sun.net.www.protocol.jar.URLJarFile.(URLJarFile.java:103)
位于java.base/sun.net.www.protocol.jar.URLJarFile.getJarFile(URLJarFile.java:72)
位于java.base/sun.net.www.protocol.jar.JarFileFactory.get(JarFileFactory.java:99)
位于java.base/sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:125)
位于java.base/sun.net.www.protocol.jar.JarURLConnection.getJarFile(JarURLConnection.java:92)
位于org.apache.catalina.startup.ExpandWar.expand(ExpandWar.java:111)
位于org.apache.catalina.startup.ContextConfig.fixDocBase(ContextConfig.java:727)
位于org.apache.catalina.startup.ContextConfig.beforeStart(ContextConfig.java:852)
位于org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:390)
位于org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
位于org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
位于org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:388)
位于org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:144)
位于org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:899)
位于org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:875)
位于org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
位于org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1092)
位于org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1984)
位于java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
位于java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
位于java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
位于java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
位于java.base/java.lang.Thread.run(Thread.java:832)

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

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