I have a console application written in C# using servicestack that has the following form:
static void Main(string[] args)
{
//Some service setup code here
Console.ReadKey();
}
This code works fine when run on windows as a console. The implementation is almost exactly https://github.com/ServiceStack/ServiceStack/wiki/Self-hosting as this is a test project
I then compile this project using mono on linux and build into a docker file.
I have no problems running up a container based on this image if it is interactive
docker run -it --name bob -p 1337:1337 <myservice>
The container runs in the foreground
However, if I omit the -it switch, the container exits straight away - I assume because there is no STDIN stream, so the Console.ReadKey() doesn't work.
I am trying to get the service hosted in a swarm, so there is no notion of detached. I can spin up a loop within my main method to keep the console service alive, but this seems hacky to me...
Is there a good way of keeping my service alive in the situation where I want to run my container detatched (docker run -d...)
Stealing from this answer for keeping .NET apps alive, you can wait without using Console
which means you don't need to keep stdin open in Docker (docke run -i
) :
private ManualResetEvent Wait = new ManualResetEvent(false);
Wait.WaitOne();
Docker will send a SIGTERM on docker stop
and a ctrl-c will send a SIGINT
so those signals should be trapped and then you let the program end with
Wait.Set();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With