我看过很多教程似乎都在做我想做的事情,但是由于某种原因,我的Docker容器退出了。基本上,我正在Docker容器内设置一个Web服务器和一些守护程序。我通过bash脚本(run- all.sh在Dockerfile中通过CMD运行)完成了最后部分。run-all.sh看起来像这样:
run- all.sh
run-all.sh
service supervisor start service nginx start
然后在Dockerfile中启动它,如下所示:
CMD ["sh", "/root/credentialize_and_run.sh"]
我可以看到,当我手动运行事物时(即使用-i -t / bin / bash进入映像),所有服务都可以正确启动,并且在运行映像时一切看起来都可以正常运行,但是一旦退出它完成了我的流程的启动。我希望这些进程可以无限期地运行,据我所知,容器必须继续运行才能实现这一点。不过,当我跑步时docker ps -a,我看到:
docker ps -a
➜ docker_test docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c7706edc4189 some_name/some_repo:blah "sh /root/run-all.sh 8 minutes ago Exited (0) 8 minutes ago grave_jones
是什么赋予了?为什么退出?我知道我可以在bash脚本的末尾放置一个while循环来保持它,但是什么是防止它退出的正确方法呢?
这并不是设计Docker容器的真正方法。
在设计Docker容器时,应该将其构建为仅运行 一个 进程(即,您应该为Nginx提供一个容器,为管理者或正在运行的应用提供一个容器);此外,该过程应在前台运行。
当进程本身退出时,容器将“退出”(在您的情况下,该进程就是您的bash脚本)。
但是,如果您 确实 需要(或想要)在Docker容器中运行多个服务,请考虑从“ Docker Base Image”开始,该镜像runit用作伪初始化进程(runit在运行Nginx和Supervisor时将保持在线状态)在前台,而其他流程则在做他们的事情。
runit
他们有大量的文档,因此您应该能够轻松轻松地实现您想做的事情。