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

新手上路,请多包涵

我看过一堆教程,它们似乎和我想做的事情一样,但由于某种原因,我的 Docker 容器退出了。基本上,我在 Docker 容器中设置了一个 Web 服务器和一些守护进程。我通过一个名为 run-all.sh 的 bash 脚本来完成最后的部分,我在 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 循环来保持它,但是阻止它退出的正确方法是什么?

原文由 Eli 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

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

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

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


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

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

原文由 Thomas Orozco 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您使用的是 Dockerfile,请尝试:

 ENTRYPOINT ["tail", "-f", "/dev/null"]

(显然这仅用于开发目的,除非容器正在运行一个进程,例如 nginx …,否则您不需要保持容器处于活动状态。)

原文由 Soft Bullets 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题