利用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

注意:如果要在脚本里启动多个服务,前面的服务一定要在后台运行,即后面加个&,最后一个服务要以前台运行。否则,全部以前台运行的话,只有第一个服务会启动;全部以后台运行的话,当最后一个服务执行完成后,容器就退出了。

声明:初心|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 利用tail -f /dev/null命令防止container启动后退出


愿你勿忘初心,并从一而终