Docker compose down杀死一个应用程序
我有一个简单的应用程序,它是一个无限循环:Docker compose down杀死一个应用程序,docker,.net-core,Docker,.net Core,我有一个简单的应用程序,它是一个无限循环: 公共静态类程序 { 公共静态void Main() { int i=0; while(true) { WriteLine(“Hey{0}”,i++); 睡眠(500); } } } 我用docker compose up-d运行这个应用程序。它工作得很好: myservice_1 | Hey 0 myservice_1 | Hey 1 myservice_1 | Hey 2 myservice_1 | Hey 3 myservice_1 |
公共静态类程序
{
公共静态void Main()
{
int i=0;
while(true)
{
WriteLine(“Hey{0}”,i++);
睡眠(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
后,一个应用程序立即被杀死
这让我很害怕,因为它可能是我的产品应用程序,不会在数据库中保存某些内容或执行一些关键的资源清理
怎么能修好呢
这是我的docker文件:
FROM microsoft/dotnet:2.0-runtime AS base
WORKDIR /app
FROM base AS final
WORKDIR /app
COPY . .
ENTRYPOINT ["dotnet", "TestApp.dll"]
感谢@muratiakos和@Miq,这段代码优雅地关闭了:
公共静态类程序
{
公共静态void Main()
{
AssemblyLoadContext.Default.Unload+=>
{
Console.WriteLine(“Got SIGTERM”);
《睡眠》(2000年);
环境。退出(0);
};
对于(int i=0;i++)
{
WriteLine(“Got{0}”,i);
睡眠(500);
}
}
}
我将实现您的容器,以优雅地捕获信号。也就是说,首先捕获SIGTERM
以启动正常关闭,这样容器甚至有时间在收到带有SIGKILL
的kill信号之前退出自身
然后,您可以使用
docker-compose kill -s SIGTERM
在您按照下所述关闭合成之前
除了docker compose之外,标准的stop--timeout 5
命令也只是首先发出一个SIGTERM
,当宽限期结束时,它会发送一个SIGKILL
,我尝试了stop
和kill
两种方法,但我的应用程序仍然在超时过期之前立即停止在应用程序中处理sigterm所需的工作。此时间段用于使容器在给定超时后停止。标准应用程序将在收到sigterm后关闭。必须明确添加处理sigterm。您是如何在容器中运行应用程序的?@Yuankun我通过docker compose
运行它的。如果您对Dockerfile
内容感兴趣,请参见编辑。您不熟悉dotnet,能否确认您的应用程序正确处理了SIGTERM
信号?@Yuankun在这种情况下,它只是一个无限循环,忽略任何符号或其他东西。但也许运行时只是杀死了我的应用程序而不是docker。。。谢谢你们的想法,我应该调查一下。若你们的应用程序将收到sigterm,而你们不处理它,这个过程将被终止。您的应用程序(以您提供的形式)不处理sigterm,因此将在信号到达时终止。要测试它,请在不使用docker的情况下运行应用程序,然后按ctrl+c(这是向应用程序发送sigterm)。