在不使用控制台 readline 或 readkey 的情况下,将自托管 servicestack 服务作为 docker 群服务打开

Keep a self hosted servicestack service open as a docker swarm service without using console readline or 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() 不起作用。

我正在尝试将服务托管在集群中,因此没有分离的概念。我可以在我的主要方法中启动一个循环来保持控制台服务的活动,但这对我来说似乎很老套...

在我想 运行 我的容器分离的情况下,有什么好的方法可以让我的服务保持活力 (docker 运行 -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 然后你让程序以 [=18 结束=]

Wait.Set();