小编典典

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

all

我看过一堆教程,它们似乎和我想做的事情一样,但由于某种原因,我的 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 循环来保持它,但是阻止它退出的正确方法是什么?


阅读 214

收藏
2022-06-07

共1个答案

小编典典

这不是你应该如何设计 Docker 容器的方式。

在设计 Docker 容器时,您应该构建它以便只运行 一个 进程(即,您应该有一个用于 Nginx 的容器,一个用于 supervisord
或它正在运行的应用程序);此外,该进程应该在前台运行。

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


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

他们有大量的文档,所以你应该能够轻松地实现你想要做的事情。

2022-06-07