Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker compose down杀死一个应用程序_Docker_.net Core - Fatal编程技术网

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)。