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