Docker-compose down杀死了一个应用程序

时间:2018-04-05 11:37:14

标签: docker .net-core

我有一个简单的应用程序,它是一个无限循环:

public static class Program
{
    public static void Main()
    {
        int i = 0;
        while (true)
        {
            Console.WriteLine("Hey {0}", i++);
            Thread.Sleep(500);
        }
    }
}

我使用docker-compose up -d运行此应用。它工作正常:

myservice_1  | Hey 0
myservice_1  | Hey 1
myservice_1  | Hey 2
myservice_1  | Hey 3
myservice_1  | Hey 4
myservice_1  | Hey 5
myservice_1  | Hey 6

好的,现在我想优雅地阻止它:

docker-compose down -t 5

我想因为这是一个无限循环,所以它会等待5秒,然后杀死一个没有完成工作的应用程序。

但是在实践中,我按下enter后立即杀死了一个应用程序。

这让我感到害怕,因为它可能是我的产品应用程序,它不会在数据库中保存某些内容或执行一些关键的资源清理。

如何解决?

这是我的泊坞文件:

FROM microsoft/dotnet:2.0-runtime AS base
WORKDIR /app

FROM base AS final
WORKDIR /app
COPY . .
ENTRYPOINT ["dotnet", "TestApp.dll"]

感谢@muratiakos和@Miq,这段代码优雅地停止了:

public static class Program
{
    public static void Main()
    {
        AssemblyLoadContext.Default.Unloading += _ =>
        {
            Console.WriteLine("Got SIGTERM");
            Thread.Sleep(2000);
            Environment.Exit(0);
        };

        for (int i = 0; ; i++)
        {
            Console.WriteLine("Got {0}", i);
            Thread.Sleep(500);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

我会实现您的容器以优雅地捕获signals。即首先捕获SIGTERM以开始正常关闭,因此容器在收到SIGKILL的终止信号之前有时间自行退出。

然后你可以用

调用一个优雅的句号
docker-compose kill -s SIGTERM 

按照

中的描述实际关闭组合物之前

除了docker撰写标准stop --timeout 5命令之外,还要先发出SIGTERM,当宽限期过去时,它会发送SIGKILL