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