Docker 如何在停靠的应用程序出现故障时发送电子邮件?

Docker 如何在停靠的应用程序出现故障时发送电子邮件?,docker,Docker,我有一个python应用程序,通过使用shell技巧,当在执行会话期间日志中出现新的错误消息时,该应用程序能够向我发送电子邮件 现在,我将它打包到docker中,并能够通过docker compose复制它的大部分功能 但当涉及到关于失败的电子邮件时,我不确定什么是实现它的最佳方式 你有什么建议?有什么最佳实践吗 更新: 该应用程序一天运行几次。以前,stderr的所有打印都复制到stdout,以在主日志文件中保留时间顺序。然后,包装器脚本会将单个会话中的所有stderr累积到另一个临时文件中。

我有一个python应用程序,通过使用shell技巧,当在执行会话期间日志中出现新的错误消息时,该应用程序能够向我发送电子邮件

现在,我将它打包到docker中,并能够通过docker compose复制它的大部分功能

但当涉及到关于失败的电子邮件时,我不确定什么是实现它的最佳方式

你有什么建议?有什么最佳实践吗

更新:

该应用程序一天运行几次。以前,stderr的所有打印都复制到stdout,以在主日志文件中保留时间顺序。然后,包装器脚本会将单个会话中的所有stderr累积到另一个临时文件中。如果该文件在会话结束后不是空的,它的内容将通过SMTP通过适当的身份验证通过一封电子邮件从我发送给我自己。在过去的几个月里,我很高兴收到并能够处理这些问题

现在我看到三种可能的解决方案:

  • 将所有值得发送的内容复制到应用程序中的临时文件中,这样docker日志就会持久存在。然后在会话结束后从入口点发送,提供了一种在容器中设置所有需求的方法

  • 从外部刷新docker日志。但这有点忽略了docker的观点

  • 通过本地网络将报告转发到另一个容器,然后用类似的东西将其发送到电子邮件中


  • TL;博士,看看NewRelic的免费层

    这里有很多东西要打开。首先,了解更多关于您以前使用backticks所做的工作会有所帮助。包括关于哪些命令可能会改变我对此的响应方式的更多信息。否则,我可能会做出一些不正确/不适用的假设

    我将通过电子邮件认为错误是一个坏主意,有几个原因:

  • 如果许多错误很快发生,您的收件箱将充斥着电子邮件和/或邮件服务器或网络流量。它是你的邮箱和网络,所以你可以做你想做的事情,但当它发生时,它往往会急剧失败,特别是在生产中
  • 要发送电子邮件,您需要通过某种SMTP服务器/网关/中继发送这些邮件,而且像这样的自动脚本常常会在触发垃圾邮件检测时被阻止。当这种情况发生并且出现错误时,消息会被悄悄地删除,而生产问题则不会报告。再次,这是你的数据/错误,你可以做到这一点,如果你想,但我不会认为这是最好的做法,就可靠性而言。在我过去的经历中,由于这个原因,我多次看到它没有发出警报
  • 根据我的经验(在该领域工作了20多年),任何通过电子邮件发送的警报都会通过邮件规则快速路由到子文件夹,并开始被忽略,因为它们很吵。一旦人们开始忽略这些消息,严重的错误就会在收件箱中消失,并被忽略
  • 错误消息的重复数据消除不是内置的,您可能会在几秒钟内收到数百或数千封电子邮件,通常会出现一个有意义的错误,比如在一堆电子邮件中找到一根针
  • 因此,出于这些原因,我建议不要使用电子邮件。如果你真的开始使用电子邮件,你可以在容器中运行一个脚本,跟踪错误日志,并使用一些smtp客户端(可以安装在docker容器中)发送电子邮件。您可能需要根据邮件服务器设置凭据,但这是可以做到的。我还是建议反对

    相反,我建议将日志发送到类似AWS SQS或AWS CloudWatch的地方,在那里,如果N分钟内有N条消息,您可以设置规则以发出警报(通过支持电子邮件警报的SNS)。您可以根据需要配置这些阈值,它还可以处理重复数据消除

    如果您不想使用AWS(或其他云提供商),您可以使用Elasticache之类的工具来存储事件,并使用脚本检查最近的事件/执行重复数据消除

    有很多第三方公司将获取这些数据,并为您提供一个存储日志的一体化解决方案和一个带有自定义通知(通过电子邮件/短信/等)的漂亮仪表板,其中一些是免费的。我想到了NewRelic,如果您不需要日志保留,它是免费的


    我不为任何一家公司工作,只是我以前工作过的一些工具,在我尝试滚动一个CrNoWork来发送SMTP消息之前,我会考虑使用它(尽管我在职业生涯中已经做过好几次了,我需要一些快速和肮脏的东西)。.

    我无法在容器中正确设置postfix或使用mail实用程序,但是python似乎工作得很好

    谢谢,我已经更新了帖子。由于缺乏代表性,我个人目前无法投票,但我可以想象,有些人可能会把这看作是对一个更一般性问题的回答。