我有一个简单的应用程序,它是一个无限循环:
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);
}
}
}
答案 0 :(得分:2)
我会实现您的容器以优雅地捕获signals
。即首先捕获SIGTERM
以开始正常关闭,因此容器在收到SIGKILL
的终止信号之前有时间自行退出。
然后你可以用
调用一个优雅的句号docker-compose kill -s SIGTERM
按照
中的描述实际关闭组合物之前除了docker撰写标准stop --timeout 5
命令之外,还要先发出SIGTERM
,当宽限期过去时,它会发送SIGKILL
。