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

我想在我的Docker容器中启动两个不同的服务,并在其中一个退出时退出容器。 我看着主pipe,但是一旦托pipe的应用程序退出,我找不到如何让它退出。 它试图重新启动三次,就像标准设置,然后就坐在那里什么都不做。 主pipe能够做到这一点,或者有没有其他的工具呢? 如果还有一种方法可以让两个托pipe程序写入标准输出,标记为应用程序名称,则可以获得奖励,例如:

[Program 1] Some output
[Program 2] Some other output
[Program 1] Output again

既然你问是否有另一个工具…我们devise和写了一个专门为Dockerdevise的supervisord的强大替代品。 它会在所有应用程序退出时自动终止,并且具有特殊的服务设置来控制此行为,并且还会使用标记为syslog的输出行redirectstdout。 它是开源的,正在用于生产。

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

还有一套完整的经过testing的基础图像,这是一个很好的例子: https : //github.com/garywiz/chaperone-docker ,但这些可能是矫枉过正的,早期的快速入门可能会有所斩获。

通过阅读文档,我find了解决我的两个需求的方法。

在应用程序退出时退出supervisord
这可以通过使用自定义eventlistener来实现。 我不得不将下面的段添加到我的supervisordconfiguration文件中:

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

supervisord将启动引用的脚本,并在给定的事件被触发时(PROCESS_STATE_EXITED在一个被pipe理程序退出之后被触发,并且不会自动重新启动)会在脚本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上接收事件数据行。 对于接收到一行(表示托pipe程序之一已经退出)的用例,SIGTERM被发送到由其pid文件(缺省位于根目录中)中的pidfind的supervisord进程。 为了技术上的完整性,我还为eventlistener提供了一个肯定的答案,尽pipe那个人不应该担心。

在标准输出上标记输出
我通过在启动supervisord之前简单地在后台启动一个尾部进程来做到这一点,拖拽程序输出日志,并通过ts(来自moreutils包)pipe线来预先标记一个标签。 这样,通过docker日志显示出一个简单的方法来查看哪个程序实际上写了行。

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