zoukankan      html  css  js  c++  java
  • 利用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
  • 相关阅读:
    【程序员的自我修养】读书笔记
    Notepad++ 正则表达式
    【BI】商务智能
    【BI】OLTP与OLAP的区别
    【Linux】条件判断eq、ne、gt、lt、ge、le
    【shell】shell基础脚本合集
    capture同focus
    c++101rule
    老生常谈,正确使用memset
    C语言的数组名和对数组名取地址
  • 原文地址:https://www.cnblogs.com/fyly/p/12827528.html
Copyright © 2011-2022 走看看