问题描述
将战争文件复制到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 后,问题就消失了。