首页 新闻 会员 周边

docker下的.net core如何优雅退出

1
悬赏园豆:20 [已解决问题] 解决于 2020-08-10 15:09

当我执行docker stop xxx的时候我希望这个xxx程序是正常退出的,因为我会在退出的时候做一些操作。
我搜索了一些答案,据说docker stop是使用SIGTERM信号来退出程序的。
然后我就监听了AppDomain.Current.ProcessExit事件,测试之后并没有看到输出。
代码如下

class Program
{
    static void Main(string[] args)
    {
        var cts = new CancellationTokenSource();
        Console.WriteLine("Hello World!");
        var bgtask = Task.Run(() => { TestService.Run(cts.Token); });
        AppDomain.CurrentDomain.ProcessExit += (s, e) =>
        {
            Console.WriteLine($"{DateTime.Now} 后台测试服务,准备进行资源清理!");

            cts.Cancel();    //设置IsCancellationRequested=true,让TestService今早结束 
            bgtask.Wait();   //等待 testService 结束执行

            Console.WriteLine($"{DateTime.Now} 恭喜,Test服务程序已正常退出!");
            Environment.Exit(0);
        };

        Console.WriteLine($"{DateTime.Now} 后端服务程序正常启动!");
        bgtask.Wait();
    }
}
陈惊蛰的主页 陈惊蛰 | 初学一级 | 园豆:150
提问于:2019-03-07 17:38
< >
分享
最佳答案
0

ENTRYPOINT dotnet Demo.dll

修改为

ENTRYPOINT ["dotnet", "Demo.dll"]

陈惊蛰 | 初学一级 |园豆:150 | 2019-03-08 09:45

设置entrypoint这是docker下dotnetcore能收到退出信号的必要条件.
然后ConsoleApplication现在已经有通用Host可以用了.
目前我所有的项目都是模块化开发, 最终由Host项目选择模块进行部署.

陈惊蛰 | 园豆:150 (初学一级) | 2020-08-10 15:08
其他回答(1)
0

建议试试 IApplicationLifetime ,详见 Application Shutdown in ASP.NET Core with IApplicationLifetime

    public void Configure(IApplicationBuilder app, IApplicationLifetime applicationLifetime)
    {
        applicationLifetime.ApplicationStopping.Register(OnShutdown);
    }
 
    private void OnShutdown()
    {
         //...
    }
收获园豆:20
dudu | 园豆:31003 (高人七级) | 2019-03-07 18:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册