首页 > 解决方案 > Azure Web App Windows 容器在正常关闭之前终止

问题描述

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

这是一个示例程序:

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;
        }
    }
}

我本来希望作为 Azure 应用服务运行的 Windows 容器触发类似“docker stop”的功能,这会将 SIGTERM 发送到我的应用程序。

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

标签: azure-web-app-servicewindows-container

解决方案


我们目前正在为 Azure 应用服务上的 Windows 容器在停止时发出信号。

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

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


推荐阅读