我用一个简单的C#程序创建了一个测试图像来测试捕获docker kill -s SIGINT $cont_id
命令发送的SIGINT信号的问题。
dockerfile:
FROM arm32v7/mono
COPY . /usr/local/bin/sigint/
CMD ["/usr/bin/mono" , "/usr/local/bin/sigint/SigIntCatcher.exe"]
的Program.cs:
static void Main(string[] args)
{
Console.CancelKeyPress += Console_CancelKeyPress;
do Thread.Sleep(2000); while (true);
}
private static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
{
Console.WriteLine($"Got signal {(e.SpecialKey == ConsoleSpecialKey.ControlC ? "Ctrl+C" : "Ctrl+Break")}");
Environment.Exit(0);
}
如果我启动docker run -it $image_id
之类的容器,而另一个终端执行docker kill -s SIGINT $cont_id
,则容器内的程序会捕获信号并输出“获取信号Ctrl + C”。
但是如果我使用docker run -d $image_id" and try to send SIGINT with
docker kill - nothing happens. I also connected to the running container with
docker exec -it $ cont_id bash and checked that
mono`进程以分离模式启动容器,则PID = 1。
我做错了什么或是单声道/码头工具中的错误? 尽管此示例使用arm系统的基本映像(Raspberry Pi),但在Ubuntu和Windows中运行类似代码时遇到同样的问题。