当前位置: 首页 > 知识库问答 >
问题:

Docker-在一个容器中处理多个服务

微生翼
2023-03-14

我想在Docker容器中启动两个不同的服务,并在其中一个退出后立即退出容器。我查看了supervisor,但找不到如何让它在一个托管应用程序退出后立即退出。它试图重启它们多达三次,就像标准设置一样,然后什么也不做。主管是否能够做到这一点,或者是否有其他工具可以做到这一点?如果还有一种方法可以让两个托管程序都写入到stdout,并标记它们的应用程序名,则会有好处,例如:

[程序1]一些输出
[程序2]一些其他输出
[程序1]再次输出

共有2个答案

邢硕
2023-03-14

通过进一步阅读文档,我找到了满足这两个需求的解决方案。

在应用程序退出时退出监控命令
这可以通过使用自定义eventlistener来实现。我必须将以下段添加到我的supervisord配置文件中:

[eventlistener:shutdownevent]
command=/shutdownhandler.sh
events=PROCESS_STATE_EXITED

supervisord将启动引用的脚本,并在触发给定事件时(进程状态退出是在一个托管程序退出后触发的,它不会自动重新启动),将在脚本stdin上发送一行包含事件数据的命令
引用的shutdownhandler脚本包含:

#!/bin/bash
while :
do
    echo -en "READY\n"
    read line
    kill $(cat /supervisord.pid)
    echo -en "RESULT 2\nOK"
done

脚本必须通过在其stdout上发送“ready\n”来指示准备就绪,之后它可能会在其stdin上接收事件数据行。对于我的用例,在收到一行(意味着其中一个托管程序已经退出)后,一个SIGTERM被发送到supervisord进程,由它留在其pid文件中的pid找到(默认情况下位于根目录中)。为了技术上的完整性,我还为eventlistener提供了一个肯定的答案,尽管这个答案应该无关紧要。

在stdout
上标记输出,我只是在后台启动一个尾部进程,然后再启动监管者,跟踪程序输出日志,并通过ts(来自more utils包)来预置一个标记。这样,它就通过docker日志显示出来,这是一种简单的方式,可以看到哪个程序实际上写了这一行。

tail -fn0 /var/log/supervisor/program1.log | ts '[Program 1]' &
宋志学
2023-03-14

既然你问有没有别的工具。。。我们为专为Docker设计的supervisord设计并编写了一个功能强大的替代品。当所有应用程序退出时,它会自动终止,并且有特殊的服务设置来控制这种行为,此外,它还会用标记的syslog兼容输出行重定向stdout。它是开源的,正在生产中使用。

以下是Docker的快速入门:http://garywiz.github.io/chaperone/guide/chap-docker-simple.html

还有一整套经过测试的基本图像,它们是以下方面的一个很好的例子:https://github.com/garywiz/chaperone-docker,但这些可能有些过分,早期的快速启动可能会奏效。

 类似资料:
  • 问题内容: 与独立容器相比,在吊舱中拥有多个容器有什么好处? 问题答案: 如果您在同一吊舱中有多个容器,它们可以彼此通话并可以共享已安装的卷。 如果每个容器有多个吊舱,则可以重新启动一个而不用重新启动另一个。假设它们由部署控制,则可以添加其中一个的其他副本,而不必扩展其他副本。如果其中一个的版本或其他特征发生更改,则不必强制重新启动另一个。您需要设置一种服务,以便彼此通信,并且它们无法通过文件系统

  • 问题内容: 这个问题是我继续研究Docker的一部分,并且在某些方面跟进了我先前的问题之一。我现在已经了解了如何通过将一堆Docker容器链接在一起来获得完整的应用程序堆栈(实际上是微型VPS)。例如,可以创建一个堆栈,为Apache+ PHP5提供一堆扩展名+ Redis + MemCached+MySQL,它们都在Ubuntu上运行,无论是否带有附加数据容器,都可以轻松地序列化用户数据。 一切

  • 问题内容: 目前,我在需要连接到camunda的docker容器内运行一个node.js应用程序,该容器在另一个容器中运行。 我使用以下命令启动容器 这两个应用程序现在都在运行,我可以通过在端口8000上导航到主机的IP来访问camunda,运行wget 还会返回camunda页面。使用和键入我的应用程序容器时,我无法访问camunda。相反,我得到以下错误: 当我使用将我的应用程序容器链接到ca

  • 问题内容: 我在一台机器上有多个docker容器。在每个容器上运行一个进程和一个为该进程提供API的Web服务器。 我的问题是,当默认端口为80时,如何从浏览器访问API?为了能够访问docker容器内的Web服务器,请执行以下操作: 这样,我可以在计算机终端上执行以下操作: 但是如何使用多个容器和多个Web服务器来处理呢? 问题答案: 您可以公开多个端口,例如 或在您的API容器前面放置一个代理

  • 我尝试使用Java中的Sockets连接到多个客户端。一切似乎都正常,但问题是,服务器只监听第一个客户端。如果有多个客户端,服务器可以向它们发送所有消息,但他可以只监听来自第一个客户端的消息。我尝试了所有这些(我从昨天开始就遇到了这个问题)。所以我很确定,错误一定在“ClientListener”类中。 说明:有一个客户端列表(用于与字符串通信的连接)。在GUI中有一个列表,我可以在其中选择要与哪

  • 我对Spring和Activiti完全陌生,并为自己做了一个运行良好的小项目。该服务中有4个服务任务、一个REST控制器、1个进程、1个服务和4个方法。 当我调用服务器endpoint时,我启动了我的流程,它只是一步一步地完成我的服务任务并调用服务。方法,如表达式${service.myMethod()}中定义的。 但是,我真正需要的是一个工作流,它在servicecall之后停止,并等待发送另一