我正在尝试在Docker容器中运行自定义服务。该服务以myservice start
开始-然后分叉并守护主进程并退出。然后,主进程在网络套接字上侦听传入的命令。该过程本身运行正常。
在我的Dockerfile中,这是最后两个命令:
WORKDIR "/app/myservice"
CMD ["bin/myservice", "start"]
图像已成功构建。现在,当我像这样运行它时:
docker run -d -p 7890:7890 myimage
容器启动,然后退出。在日志中,我可以看到服务在容器以退出代码0退出之前启动。这是预期的,因为dockerfile中的命令以代码0退出。
看着this question,看来如果我像这样运行它:
docker run -dit -p 7890:7890 myimage
即使启动我的服务的批处理脚本退出后,容器也应保持运行状态。事实并非如此-容器终止处的出口立即消失。
我想念什么?如何使容器保持运行状态?
答案 0 :(得分:0)
比较这两个容器的寿命
1)
docker run -it ubuntu sh -c "echo Hello ; sleep 3"
2)
docker run -it ubuntu sh -c "while true ; do echo Hello ; sleep 3 ; done"
检查CMD文档
https://docs.docker.com/engine/reference/builder/#cmd
和ENTRYPOINT
https://docs.docker.com/engine/reference/builder/#entrypoint
当您
docker run -it ubuntu bash
只要您退出bash,容器就会完成并退出。
也检查
What is the difference between CMD and ENTRYPOINT in a Dockerfile?
`
答案 1 :(得分:0)
当容器的第一个PID 1(已更新!)过程完成(退出0或其他)时,也会发生容器退出。
要使容器保持活动状态,第一个pid必须也保持活动状态...
在脚本myservice的末尾,您可以添加以下行tail -f /dev/null
答案 2 :(得分:0)
通常,您不需要守护容器中的任何东西。常见的模式是启动一个永久存在的命令,并打印到STDOUT / STDERR中。 当/如果该命令失败,容器将停止。 因此,删除
...然后分叉并守护主进程并退出...
分开并启动您的主要过程。