Dockerfile中使用ENTRYPOINT,而不是CMD,至于这俩命令有啥区别,百度下吧。
ENTRYPOINT ["dotnet", "LS.Saas.BaseInfo.HttpApi.Host.dll"]
Startup.cs中的Configure方法注入:IApplicationLifetime lifeTime,它的ApplicationStopping就可以捕获到停止状态,不管是控制台停止,还是docker停止。
//注销服务 lifeTime.ApplicationStopping.Register(() => { client.Agent.ServiceDeregister(serviceId).GetAwaiter().GetResult(); });
1.docker stop [容器ID],起作用
2.docker rm -f [容器ID],是不起作用的
完整代码:
/// <summary> /// 服务注册 /// </summary> public static void ConsulRegister(IHostApplicationLifetime lifeTime) { var serviceId = $"{ConsulServiceIP}_{DateTime.Now.Ticks}"; //注册服务 ConsulClient client = new ConsulClient( (ConsulClientConfiguration c) => { c.Address = new Uri(Configuration["Consul:Address"]); //Consul服务中心地址 c.Datacenter = Configuration["Consul:DataCenter"]; //指定数据中心,如果未提供,则默认为代理的数据中心。 } ); string checkUrl = Configuration["Consul:CheckUrl"]; client.Agent.ServiceRegister(new AgentServiceRegistration() { ID = serviceId, //服务编号,不可重复 Name = Configuration["Consul:ServiceName"], //服务名称 Port = ConsulServicePort, //本程序的端口号 Address = ConsulServiceIP, //本程序的IP地址 Check = new AgentServiceCheck() { DeregisterCriticalServiceAfter = TimeSpan.FromMilliseconds(1), //服务停止后多久注销 Interval = TimeSpan.FromSeconds(5), //服务健康检查间隔 Timeout = TimeSpan.FromSeconds(5), //检查超时的时间 HTTP = $"http://{ConsulServiceIP}:{ConsulServicePort}{checkUrl}" //检查的地址 } }); //注销服务 lifeTime.ApplicationStopping.Register(() => { client.Agent.ServiceDeregister(serviceId).GetAwaiter().GetResult(); }); }
设置entrypoint,这是docker下dotnetcore能收到退出信号的必要条件。
参考网址:https://q.cnblogs.com/q/113552/