如何使用docker优雅地关闭dotnet?

时间:2016-11-22 12:42:30

标签: c# .net docker .net-core

有没有办法正常关闭 DOCKER 中运行的 DOTNET CORE 应用程序?如果是的话,我应该听哪个活动?

我想要的只是取消请求我想将我的取消令牌传递给当前的方法,并在他们工作时推迟关闭。

寻找与dotnet核心相关的示例代码,参考链接等,而不是通用信息

  

更新   此问题与docker container exits immediately even with Console.ReadLine() in a .net core console application不重复,因为我没有立即退出问题。我需要利用Windows.SystemsEvents.SessionEnding这样的事件并依赖select AVG(datediff(date2, date1)) from table group by year(date1), month(date1); 和/或实施Console.CancelKeyPress并不适合该法案。

4 个答案:

答案 0 :(得分:7)

在.NET Core 2.0中,您可以使用AppDomain.CurrentDomain.ProcessExit事件,该事件在Docker中的Linux上运行良好。 AssemblyLoadContext.Default.Unloading可能也适用,甚至在.NET Core 2.0之前。

答案 1 :(得分:4)

System.Console有一个名为CancelKeyPress的事件。我相信当sigint事件传递到dotnet时会被触发。

System.Console.CancelKeyPress += (s,e) => { /* do something here */};

答案 2 :(得分:2)

使用 2.0.0-preview2-006497 我做了一些测试,现在当Docker将SIGTERM / SIGINT发送到容器时会触发 AssemblyLoadContext.Default.Unloading

示例代码如下:

System.Runtime.Loader.AssemblyLoadContext.Default.Unloading += ctx =>
{
    // code here...
};

有关详细信息,请参阅此问题:https://github.com/aspnet/Hosting/issues/870

答案 3 :(得分:1)

如果您的容器在Linux中运行,那么Loader.AssemblyLoadContext.Default.Unloading可以工作,因为它可以捕获SIGTERM信号,但是Windows没有相应的机制(variable variables)。以下是使用SetConsoleCtrlHandler

中的namespace Routeguide { using System; using System.Threading; ... class Program { [DllImport("Kernel32")] internal static extern bool SetConsoleCtrlHandler(HandlerRoutine handler, bool Add); internal delegate bool HandlerRoutine(CtrlTypes ctrlType); internal enum CtrlTypes { CTRL_C_EVENT = 0, CTRL_BREAK_EVENT, CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT = 5, CTRL_SHUTDOWN_EVENT } static void Main(string[] args) { // do the server starting code Start(); .... var shutdown = new ManualResetEvent(false); var complete = new ManualResetEventSlim(); var hr = new HandlerRoutine(type => { Log.Logger.Information($"ConsoleCtrlHandler got signal: {type}"); shutdown.Set(); complete.Wait(); return false; }); SetConsoleCtrlHandler(hr, true); Console.WriteLine("Waiting on handler to trigger..."); shutdown.WaitOne(); Console.WriteLine("Stopping server..."); // do the server stopping code Stop(); complete.Set(); GC.KeepAlive(hr); } } } 来处理Windows中的关机通知的答案
{{1}}