无法删除共享文件系统中的文件

Unable to delete files in shared filesystem

今天在部署 Linux 容器应用程序期间,该应用程序开始失败并且再也没有出现。调查 Kudu 中的日志,我可以看到应用程序无法 运行 因为在安装依赖项期间,程序会在尝试删除文件时崩溃。

试图手动删除文件,它继续崩溃:

/home/site/wwwroot>ls -la libs/lxml
total 6868
drwxrwxrwx 2 nobody nogroup    4096 Oct 28 01:13 .
drwxrwxrwx 2 nobody nogroup   16384 Oct 28 01:23 ..
-rwxrwxrwx 1 nobody nogroup  304689 Oct 27 20:09 _elementpath.cpython-36m-x86_64-linux-gnu.so
-rwxrwxrwx 1 nobody nogroup 6704624 Oct 27 20:09 etree.cpython-36m-x86_64-linux-gnu.so
/home/site/wwwroot>rm -Rf libs
rm: cannot remove 'libs/lxml': Directory not empty
rm: cannot remove 'libs/newrelic/core': Directory not empty
rm: cannot remove 'libs/newrelic/packages/wrapt': Directory not empty

/home/site/wwwroot>rm -R libs
rm: cannot remove 'libs/lxml/etree.cpython-36m-x86_64-linux-gnu.so': No such file or directory
rm: cannot remove 'libs/lxml/_elementpath.cpython-36m-x86_64-linux-gnu.so': No such file or directory
rm: cannot remove 'libs/newrelic/core/_thread_utilization.cpython-36m-x86_64-linux-gnu.so': No such file or directory
rm: cannot remove 'libs/newrelic/packages/wrapt/_wrappers.cpython-36m-x86_64-linux-gnu.so': No such file or directory

我已经 'stopped' 应用程序,但文件仍然无法删除。

如果不删除并重新创建应用程序,我有什么选择可以再次 运行ning 应用程序?

Edit:我尝试按照建议使用 rm -rf,但由于 -r-R 是相同的选项,所以没有区别:

/home/site/wwwroot>ls -la libs
total 16
drwxrwxrwx 2 nobody nogroup 16384 Oct 28 01:23 .
drwxrwxrwx 2 nobody nogroup     0 Sep 10 03:51 ..
drwxrwxrwx 2 nobody nogroup     0 Oct 28 01:13 lxml
drwxrwxrwx 2 nobody nogroup     0 Oct 28 01:13 newrelic
/home/site/wwwroot>rm -rf libs
rm: cannot remove 'libs/lxml': Directory not empty
rm: cannot remove 'libs/newrelic/core': Directory not empty
rm: cannot remove 'libs/newrelic/packages/wrapt': Directory not empty

/home/site/wwwroot>rm -rf libs
rm: cannot remove 'libs/lxml': Directory not empty
rm: cannot remove 'libs/newrelic/core': Directory not empty
rm: cannot remove 'libs/newrelic/packages/wrapt': Directory not empty

我无法使用 SSH 选项,因为我使用 python:3 作为容器(没有 Azure 自定义)。

我曾经(在这个应用程序上)尝试过使用 container customized for Azure the source for which is here。该容器所做的只是在应用程序启动期间添加了一个启动 SSH 服务的额外步骤,因此它似乎不太可能与当前故障有关。

编辑:我更新了应用程序以使用 jaraco/python-azure 容器(并修复了该容器中的错误)。我能够在短时间内通过 SSH 连接到应用程序容器,我在其中尝试安装 lsof,但在该命令完成之前,SSH 连接显示已断开连接,我怀疑是因为 docker 容器正在退出无法删除文件。

我一直无法通过 SSH 重新连接,因为我从 webssh 端点收到内部服务器错误:

我尝试为容器使用不同的启动文件:init_container.sh bash -c \"sleep 300\",这样当我通过 ssh 访问它时它可能会旋转 5 分钟,但即使我这样做了,我也无法通过 SSH 访问它和我只从 webssh 端点收到 503 错误,即使在诊断控制台中,我可以看到它使用适当的命令启动 docker 图像。

我也尝试将启动文件更新为 init_container.sh rm -rf /home/site/wwwroot/libs/*,但使用诊断控制台,我发现应用程序容器中发生了同样的错误:

2017-10-31 02:36:40.629 INFO - Issuing docker pull: imagename =jaraco/python-azure:latest
2017-10-31 02:36:40.668 INFO - Issuing docker pull: imagename =jaraco/python-azure:latest 
2017-10-31 02:36:40.709 INFO - Issuing docker pull jaraco/python-azure:latest 
2017-10-31 02:36:41.835 INFO - docker pull returned STDOUT>> latest: Pulling from jaraco/python-azure
Digest: sha256:589b1150b8b5893662a9dc7d0919e577cb2a95fcb0524fd1fffd7e5d8122b261
Status: Image is up to date for jaraco/python-azure:latest 
2017-10-31 02:36:41.855 INFO - Starting container for site 
2017-10-31 02:36:41.856 INFO - docker run -d -p 28374:80 --name APPNAME-dev_0 -e PORT=80 -e WEBSITE_SITE_NAME=APPNAME-dev -e WEBSITE_AUTH_ENABLED=False -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_INSTANCE_ID=110c23d861dcaa09836ed00f278d29dc4b913a207c2d9dd4ed54366e3c2f6a3a -e HTTP_LOGGING_ENABLED=1 jaraco/python-azure:latest init_container.sh rm -rf /home/site/wwwroot/libs/*

2017-10-31 02:36:47.946 INFO - Container logs 
2017-10-31T02:36:42.675769119Z Starting OpenBSD Secure Shell server: sshd. 
2017-10-31T02:36:44.736417871Z rm: cannot remove ‘/home/site/wwwroot/libs/lxml’: Directory not empty
2017-10-31T02:36:45.596986651Z rm: cannot remove ‘/home/site/wwwroot/libs/newrelic/core’: Directory not empty
2017-10-31T02:36:45.649171980Z rm: cannot remove ‘/home/site/wwwroot/libs/newrelic/packages/wrapt’: Directory not empty
2017-10-31 02:36:47.947 ERROR - Container APPNAME-dev_0 for site APPNAME-dev has exited, failing site start

我正在失去希望。还有其他选择吗?

编辑:将应用服务计划从 S1 更改为 S2,向服务发出请求(触发移动),然后将应用切换回 S1 已清除问题,但只是暂时的。当在一周的晚些时候,该服务有新的流量时,它工作了一小会儿,然后再次开始失败,服务不可用。检查日志,同样的错误又回来了。在启动期间,应用程序尝试删除这些文件,但由于这些文件显然正在使用中,因此删除和后续启动步骤失败。更糟糕的是,更改应用程序服务计划虽然上周似乎解决了这个问题,但这一次似乎还不足以解决问题。此外,调整应用服务计划的大小虽然有效,但也会产生意想不到的副作用,例如使该服务计划中的其他应用脱机。

我怀疑有关共享文件系统(挂载在 /home)的某些实现细节导致打开的文件被锁定,因此无法通过部署过程或另一个实例启动或手动删除。

我很确定我唯一的选择是不对应用程序可能保持打开的任何文件(例如共享库)使用共享文件系统。

编辑:为了尽可能少地重现这个问题,我创建了 this web app and deployed it here。目前运行宁晴。我希望在让它闲置一段时间后,它会被刷新,随后的请求会再次触发它到 运行 并且它会失败。有没有效果我会反馈的

编辑:我未能在新的网络应用程序中重现该问题。我试过让应用程序闲置 24 小时,看看这是否会触发问题。我还尝试过显式降级 'newrelic' 依赖项(其中包含 .so 共享库之一),并启动和停止 webapp 以再次触发 'run' 脚本。但无论我做什么,应用程序都能正常启动。我现在想我应该擦除并重建我失败的生产应用程序,看看问题是否消失。

在 Kudu 控制台中,您可以尝试 SSH 您的网络应用程序。您以 root 用户登录,您可以删除这些文件和目录。

如果不需要目录libs/lxml,建议按照以下步骤删除

cd /home/site/wwwroot/libs/lxml
rm -rf *
cd ..
rm -rf * ## rm -rf lxml
cd ..
rm -rf libs

更新:

调整应用服务计划大小会将您的网络应用更改为其他主机,也许它会解决这个问题。

这似乎是 Azure Web 应用程序的设计限制。共享文件系统中由应用程序保持打开状态(即使只是为了读取)的任何文件都不可写或不可删除。唯一的选择是重新设计应用程序以将此类文件存储在共享文件系统以外的地方。

我怀疑 Windows 上托管的共享文件系统加剧了这个问题。在 Unix 系统上,通常可以删除文件,即使它已被另一个进程打开。因此,对于 Web Apps For Containers 的用户来说,文件无法删除是一个额外的惊喜,因此他们只是在没有错误的情况下徘徊。