gpt4 book ai didi

docker - Docker-compose down杀死了一个应用

转载 作者:行者123 更新时间:2023-12-02 19:06:49 24 4
gpt4 key购买 nike

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

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后会立即杀死一个应用程序。

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

如何解决?

这是我的docker文件:
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);
}
}
}

最佳答案

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

然后,您可以通过

docker-compose kill -s SIGTERM 

在按照以下说明实际关闭合成之前
  • https://docs.docker.com/compose/reference/kill/

  • 除了docker compose之外,标准的 stop --timeout 5命令还只是首先发出 SIGTERM,并且在宽限期过去后会发送 SIGKILL

    关于docker - Docker-compose down杀死了一个应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49671415/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com