在今天为容器部署 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 端点收到内部服务器错误:
我尝试为容器使用不同的启动文件: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 以再次触发“运行”脚本。但无论我做什么,应用程序都可以正常启动。我现在想我应该擦除并重建失败的生产应用程序,看看问题是否消失。