3

在今天为容器部署 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

我已经“停止”了该应用程序,但这些文件仍然无法删除。

除了删除和重新创建应用程序之外,我还需要哪些选项才能让应用程序再次运行?

编辑:我尝试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 自定义)。

我曾经(在此应用程序上)尝试使用为 Azure 定制的容器,源代码在此处。该容器所做的只是在应用程序启动期间添加了一个额外的启动 SSH 服务的步骤,因此它似乎不太可能与当前的故障有关。

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

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

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)的一些实现细节会导致打开的文件被锁定,因此无法被部署过程或另一个实例启动或手动删除。

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

编辑:为了尽量减少复制问题,我创建了这个网络应用程序并将其部署在这里。它目前运行良好。我希望在让它闲置一段时间后,它会被刷新,随后的请求会触发它再次运行,它会失败。我会报告它是否有效。

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

4

2 回答 2

1

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

如果您不需要 directory libs/lxml,我建议您可以按照以下步骤删除。

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

更新:

Resize App Service Plan size 会将您的 Web 应用程序更改为其他主机,也许它会解决此问题。

于 2017-10-30T09:18:18.053 回答
1

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

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

于 2017-11-25T13:12:04.677 回答