我有一个使用 servicestack 用 C# 编写的控制台应用程序,其形式如下:
static void Main(string[] args)
{
//Some service setup code here
Console.ReadKey();
}
这段代码在 Windows 上作为控制台运行时工作正常。实现几乎完全一样https://github.com/ServiceStack/ServiceStack/wiki/Self-hosting 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 run -d ...)
偷窃自这个答案让 .NET 应用程序保持活力 https://stackoverflow.com/a/34099238/1318694,您可以等待而不使用Console
这意味着您不需要在 Docker 中保持标准输入打开(docke run -i
) :
private ManualResetEvent Wait = new ManualResetEvent(false);
Wait.WaitOne();
Docker 将发送一个 SIGTERMdocker stop
并且 ctrl-c 将发送SIGINT
so 这些信号应该被捕获 https://stackoverflow.com/questions/6546509/detect-when-console-application-is-closing-killed然后你让程序结束
Wait.Set();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)