一尘不染

启动服务后如何保持Docker容器运行?

docker

我看过很多教程似乎都在做我想做的事情,但是由于某种原因,我的Docker容器退出了。基本上,我正在Docker容器内设置一个Web服务器和一些守护程序。我通过bash脚本(run- all.sh在Dockerfile中通过CMD运行)完成了最后部分。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_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循环来保持它,但是什么是防止它退出的正确方法呢?


阅读 756

收藏
2020-06-17

共1个答案

一尘不染

这并不是设计Docker容器的真正方法。

在设计Docker容器时,应该将其构建为仅运行 一个
进程(即,您应该为Nginx提供一个容器,为管理者或正在运行的应用提供一个容器);此外,该过程应在前台运行。

当进程本身退出时,容器将“退出”(在您的情况下,该进程就是您的bash脚本)。


但是,如果您 确实 需要(或想要)在Docker容器中运行多个服务,请考虑从“ Docker Base
Image”开始
,该镜像runit用作伪初始化进程(runit在运行Nginx和Supervisor时将保持在线状态)在前台,而其他流程则在做他们的事情。

他们有大量的文档,因此您应该能够轻松轻松地实现您想做的事情。

2020-06-17