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