即使使用-it

时间:2018-10-16 15:03:05

标签: docker containers

我正在尝试在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

即使启动我的服务的批处理脚本退出后,容器也应保持运行状态。事实并非如此-容器终止处的出口立即消失。

我想念什么?如何使容器保持运行状态?

3 个答案:

答案 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中。 当/如果该命令失败,容器将停止。 因此,删除

  

...然后分叉并守护主进程并退出...

分开并启动您的主要过程。