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

Docker-在单个容器中处理多个服务,docker,supervisord,foreground-service,Docker,Supervisord,Foreground Service,我想在Docker容器中启动两个不同的服务,并在其中一个退出后立即退出容器。我查看了supervisor,但找不到如何让它在一个托管应用程序退出后立即退出。它尝试重启它们最多三次,就像标准设置一样,然后什么也不做。主管是否能够做到这一点,或者是否有其他工具可以做到这一点?如果还有一种方法可以让两个托管程序都写入到标准输出,并标记它们的应用程序名,则会有好处,例如: [程序1]一些输出 [程序2]其他一些输出 [程序1]再次输出 既然你问有没有别的工具。。。我们为专门为Docker设计的super

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

[程序1]一些输出

[程序2]其他一些输出

[程序1]再次输出


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

以下是Docker的快速入门:


还有一整套经过测试的基本映像,这在以下方面是一个很好的例子:,但这些可能有些过分,早期的快速启动可能会起到作用。

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

应用程序退出时退出监控命令
这可以通过使用自定义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提供了一个肯定的答案,尽管这个答案根本不重要

在标准输出上标记输出
在启动supervisord之前,我只需在后台启动一个tail进程,跟踪程序输出日志,并通过ts(从moreutils包中)管道传输这些行,为其添加一个标记。通过这种方式,它可以通过docker日志显示,并以一种简单的方式查看到底是哪个程序编写了该行

tail -fn0 /var/log/supervisor/program1.log | ts '[Program 1]' &

@perror的可能重复您链接的问题更像是“是否可能”,而我问的是“我如何才能完全这样做”。另外,这个问题已经问了将近两年了,这在docker universe中可能是很长的时间了,因为当这个问题被问到和回答时,链接似乎刚刚被引入。谢谢你的回答,chaperone看起来真的很好,似乎勾选了我需要的所有框。不幸的是,通过安装python3pip将230MB的内存添加到映像中,这让我很想使用它。在任何已经包含python3的映像中,这都是一个不需要动脑筋的问题,但我不太确定其他映像(我当前使用的映像安装了python2.7,所以supervisord只占用了2MB左右)。实际上,不是python3 pip给映像增加了230MB,而是对gcc构建链的依赖(您可以消除)。例如,chaperonealpinebase映像(上面的链接)只有55MB(总计),包括完整的操作系统发行版Python3+pip+chaperone。它功能齐全,是一个很好的案例研究,说明了其他图片实际上有多胖。甚至ubuntu chaperone baseimage的总容量也是345MB。不过,我同意你的观点,我们计划在未来几个月内推出一个.go版本。非常感谢您的反馈。如果您想节省大量空间,请使用--no install recommendants,如下所示,您会惊讶于其中的差异:“apt get install--no install recommendants-y python3 pip then”pip3 install chaperone“。由于这似乎是一个热门话题,我刚刚添加了一个小教程,介绍如何创建尽可能最小的基于伴侣的图像: