在不使用控制台 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();
我有一个使用 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();