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

cil*_*ler 15 .net c# docker .net-core

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

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

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

更新即使在.net核心控制台应用程序中使用Console.ReadLine(), 这个问题也不会立即与docker容器出口重复,因为我没有立即退出问题.我需要利用像Windows.SystemsEvents.SessionEnding这样的事件并依赖Console.CancelKeyPress和/或实现WebHostBuilder()不适合账单.

Mar*_*ist 9

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

  • @J.AndrewLaughlin:是的,时间因环境而异。例如,在 Kubernetes 中,`kubectl delete deployment ...` 命令似乎会触发 SIGTERM,通常允许应用程序大约 30 秒进行清理。另一方面,`kubectl apply ...` _over_ 现有部署似乎会立即导致 SIGKILL,根本没有时间进行清理。不幸的是,关于这些行为的文档很少甚至不存在。 (3认同)
  • 'docker stop <container id>' 将触发 AppDomain.CurrentDomain.ProcessExit。需要注意的是,您的代码只有 2 秒的时间来处理它。请参阅:https://learn.microsoft.com/en-us/dotnet/api/system.appdomain.processexit?view=netcore-2.1 和 https://github.com/dotnet/coreclr/issues/2688#issuecomment- 394843595 (2认同)

Ter*_*Dev 5

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

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