V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
stille
V2EX  ›  Docker

求教 dockerfile 启动命令 CMD 后容器就停了

  •  
  •   stille ·
    stilleshan · 2020-02-01 16:47:54 +08:00 · 4755 次点击
    这是一个创建于 1543 天前的主题,其中的信息可能已经有所发展或是发生改变。

    ubuntu 内安装 caddy 和一个 serverstatus 程序.

    测试时 dockerfile 没有写 CMD 命令,构建后启动容器正常.需要 docker exec 进入容器执行以下两个命令启动服务.

    • /etc/init.d/status-server start
    • /etc/init.d/caddy start

    然后就正常启动了.可以使用.

    但是我想把启动命令写到 CMD 里,让容器启动自动起这 2 个服务,查了很多多命令写法都不行,启动容器立马 down 了,于是写了个脚本,然后 CMD /bin/bash -c ./start.sh

    可是依旧一启动就 down..查看日志,只显示这 2 个服务已经成功启动,没其他任何错误日志...

    新手求助各位如何解决..

    4 条回复    2020-02-02 00:13:30 +08:00
    blless
        1
    blless  
       2020-02-01 16:56:35 +08:00 via Android
    因为 docker 不是虚拟机,当做一个进程更合适。而且 docker 容器只会监听前台进程,你执行的命令如果执行完前台没有停留马上转为后台执行,容器也会认为当前进程已经退出,就自动退出容器
    ashong
        2
    ashong  
       2020-02-01 17:04:32 +08:00   ❤️ 1
    要么不要后台运行
    要么在 start.sh 末尾加入 tail -f /dev/null
    stille
        3
    stille  
    OP
       2020-02-01 18:07:59 +08:00
    @blless 谢谢
    @ashong 谢谢大佬,果然加上就可行了...虽然不懂什么意思..
    shawn7
        4
    shawn7  
       2020-02-02 00:13:30 +08:00
    对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其它辅助进程不是它需要关心的东西。

    对于 CMD /bin/bash -c ./start.sh ,会被理解为 CMD [ "sh", "-c", "/bin/bash -c ./start.sh"],因此主进程实际上是 sh
    所以,正确的写法是 CMD ["/etc/init.d/caddy", "start"]
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3600 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 10:53 · PVG 18:53 · LAX 03:53 · JFK 06:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.