c# – 保持自托管服务堆栈服务作为docker swarm服务打开,而不使用控制台readline或readkey

我有一个使用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();
上一篇:.NET(C#)主流的ORM框架


下一篇:c# – 在插件中注册服务前缀 – ServiceStack