我有一个使用servicestack用C#编写的控制台应用程序,其形式如下:
static void Main(string[] args)
{
//Some service setup code here
Console.ReadKey();
}
在Windows上作为控制台运行时,此代码可以正常工作.实施几乎完全是https://github.com/ServiceStack/ServiceStack/wiki/Self-hosting,因为这是一个测试项目
然后我在linux上使用mono编译这个项目并构建成一个docker文件.
如果它是交互式的,那么基于这个图像运行容器没有问题
docker run -it --name bob -p 1337:1337 <myservice>
容器在前台运行
但是,如果省略-it开关,容器会立即退出 – 我假设因为没有STDIN流,所以Console.ReadKey()不起作用.
我正在尝试将服务托管在一个群中,因此没有分离的概念.我可以在我的main方法中启动一个循环来保持控制台服务的活着,但这对我来说似乎很烦人……
是否有一种很好的方法可以保持我的服务在我想要运行我的容器detatched(docker run -d …)的情况下
解决方法:
从this answer for keeping .NET apps alive窃取,您可以在不使用Console的情况下等待,这意味着您不需要在Docker(docke run -i)中保持stdin打开:
private ManualResetEvent Wait = new ManualResetEvent(false);
Wait.WaitOne();
Docker会在docker stop上发送一个SIGTERM,而ctrl-c会发送一个SIGINT,所以those signals should be trapped然后你让程序结束
Wait.Set();