利用tail -f /dev/null命令防止container启动后退出

Posted fyly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用tail -f /dev/null命令防止container启动后退出相关的知识,希望对你有一定的参考价值。

利用tail -f /dev/null命令防止container启动后退出


container 刚起来的时候,用户可以通过 dockerfile 中的 CMD,ENTRYPOINT,或者直接在 docker run 后面接 comand,来指定 container 启动时执行的程序。如果指定的程序只是一个短暂的任务,比如 echo sorry。那么,sorry,container 在输出 “sorry” 之后,就退出了。可以通过 docker inspect 看到,container 状态变成了 Exited。

有人说,这有什么关系,container 还在那里,没有销毁,只是状态值不是 running 而已。

可是,可是,这个真是有关系啊!

一旦进入 Exited 状态,以下命令将不再 work:

  • docker exec <container>
  • docker attach <container>
    这两个命令都需要 <container>处于 running!

重启,重启
在非常不情愿接受以上事实之后,你或许马上想到了解决方案—— docker start

官方文档里有明确指出,docker start <container> 可以重新启动 <container>,那它又可以转成 running 状态啦~~

是的,没错!

但是,(很残忍滴告诉你)问题依然没有解决!

刚刚 start 的 container 在启动之后,会再一次执行 CMD 的命令。然后。。然后。。它又很快完成任务,进入 Exited 状态休息了。。。

解决方法

可以利用tail -f /dev/null让容器一直处于runing状态,但是如果存在多个CMD指令,仅最后一个生效,如果还要启动服务。这怎么办呢?
可以用CMD 执行一个脚本,在脚本中启动多个服务。
例如我们要执行run.sh这个脚本,利用这个脚本启动主服务,并执行tail -f /dev/null:
dockerfile:

CMD [ "./run.sh" ]

run.sh脚本:

#!/bin/bash

START_CMD="bin/start-solo.sh"
exec $START_CMD &

tail -f /dev/null

以上是关于利用tail -f /dev/null命令防止container启动后退出的主要内容,如果未能解决你的问题,请参考以下文章

获取输出到 /dev/null 的命令的执行时间

linux中 /dev/null命令

Linux命令之查看日志等实时文件命令(less tail)使用

linux中 “/dev/null” 命令的探索

对带有 2>/dev/null 的命令使用 subprocess.check_output

Linux下 “>/dev/null 2>&1 “ 命令学习