Azure Web App Windows 容器在正常关闭前终止

Azure Web App Windows Container Terminated before gracefull shutdown

我创建了一个 .NET Framework 控制台程序,它启动并运行一些代码,然后在退出时它应该在退出之前注销任何外部服务(正常关闭)。

这是一个示例程序:

using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace delayed_shutdown
{
    class Program
    {
        public enum CtrlTypes
        {
            CTRL_C_EVENT = 0,
            CTRL_BREAK_EVENT,
            CTRL_CLOSE_EVENT,
            CTRL_LOGOFF_EVENT = 5,
            CTRL_SHUTDOWON_EVENT
        }

        [DllImport("Kernel32")]
        public static extern bool SetConsoleCtrlHandler(HandlerRoutine handler, bool Add);

        public delegate bool HandlerRoutine(CtrlTypes CtrlType);
        public static volatile HandlerRoutine handlerRoutine = new HandlerRoutine(ConsoleCtrlCheck), true)

        public static volatile ManualResetEvent exitEvent = new ManualResetEvent(false);


        public static bool ConsoleCtrlCheck(CtrlTypes ctrlType)
        {
            switch (ctrlType)
            {
                case CtrlTypes.CTRL_C_EVENT:
                    Console.WriteLine("CTRL_C received");
                    exitEvent.Set();
                    return true;

                case CtrlTypes.CTRL_CLOSE_EVENT:
                    Console.WriteLine("CTRL_CLOSE received");
                    exitEvent.Set();
                    return true;

                case CtrlTypes.CTRL_BREAK_EVENT:
                    Console.WriteLine("CTRL_BREAK received");
                    exitEvent.Set();
                    return true;

                case CtrlTypes.CTRL_LOGOFF_EVENT:
                    Console.WriteLine("CTRL_LOGOFF received");
                    exitEvent.Set();
                    return true;

                case CtrlTypes.CTRL_SHUTDOWON_EVENT:
                    Console.WriteLine("CTRL_SHUTDOWN received");
                    exitEvent.Set();
                    return true;

                default:
                    return false;
            }
        }

        static int Main(string[] args)
        {
            if (!SetConsoleCtrlHandler(handlerRoutine))
            {
                Console.WriteLine("Error setting up control handler... :(");
                return -1;
            }

            Console.WriteLine("Waiting for control event...");

            exitEvent.WaitOne();

            var i = 60;
            Console.WriteLine($"Exiting in {i} seconds...");
            while (i > 0)
            {
                Console.WriteLine($"{i}");
                Thread.Sleep(TimeSpan.FromSeconds(1));
                i--;
            }
            Console.WriteLine("Goodbye");
            return 0;
        }
    }
}

我原以为 Windows 容器 运行 作为 Azure 应用服务会触发“docker 停止”之类的函数,这会将 SIGTERM 发送到我的应用程序。

但是发生的事情是 Azure Web App Windows 容器在尝试停止容器 1 秒后终止。如何要求 Azure Web App 在终止 windows 容器之前等待 X 秒?

拦截 SIGTERM 事件目前不受支持。由于 App Service 是为 HTTP 工作负载量身定制的,所以我很好奇让控制台应用程序接收此类事件的原因。如果您可以进一步详细说明,可能会有替代方案,例如 运行 您的控制台应用程序作为 Web 作业。

我们目前正在为 Azure App Service 上的 Windows 容器发出进程停止信号。

在 Azure 应用服务中,我们将默认等待容器在关闭时退出 5 秒,但我们将允许使用以下应用设置对其进行配置:WEBSITES_CONTAINER_STOP_TIME_LIMIT,我们将允许等待到 2 分钟 (WEBSITES_CONTAINER_STOP_TIME_LIMIT=00:02:00)

此功能将在下一次更新推出时部署,我希望明年初在全球范围内可用,一旦推出,我们也会更新我们的文档,敬请期待。