asp.net core 如何在Docker停止时,代码注销Consul中的服务

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/

原文地址:https://www.cnblogs.com/subendong/p/14344342.html