容器内 Python 脚本的健康检查

health check for Python script inside a container

我在容器中有一个 python 脚本 运行,有时它会失败。 我想知道是否可以为该脚本创建健康检查,如果失败,请删除该容器并创建一个新容器。

我建议编辑日志下载程序以确保它存在,

... # line 255 ( https://github.com/imperva/incapsula-logs-downloader/blob/master/script/LogsDownloader.py )

    """
    Saves the decrypted file content to a log file in the filesystem
    """
    def handle_log_decrypted_content(self, filename, decrypted_file):
        decrypted_file = decrypted_file.decode('utf-8')

        if self.config.SYSLOG_ENABLE == 'YES':
            syslogger = logging.getLogger("syslog")
            syslogger.setLevel(logging.INFO)

            if self.config.SYSLOG_PROTO == 'TCP':
                self.logger.info('Syslog enabled, using TCP')
                syslog = logging.handlers.SysLogHandler(address=(self.config.SYSLOG_ADDRESS, int(self.config.SYSLOG_PORT)), socktype=socket.SOCK_STREAM)
            else:
                self.logger.info('Syslog enabled, using UDP')
                syslog = logging.handlers.SysLogHandler(address=(self.config.SYSLOG_ADDRESS, int(self.config.SYSLOG_PORT)))
            
            ### Add by Maytee Sittipornchaisakul
            if not self.setOutputSyslogHandler:
                syslogger.addHandler(syslog)
                self.setOutputSyslogHandler = True                
            
            for msg in decrypted_file.splitlines():
                if msg != '':
                    try:
                        syslogger.info(msg)
                    except:
                        self.logger.error('Error sending log file to syslog server %s on port %s via protocol %s', self.config.SYSLOG_ADDRESS, self.config.SYSLOG_PORT, self.config.SYSLOG_PROTO)
                        self.running = False
                        sys.exit(1)

        if self.config.SAVE_LOCALLY == "YES":
            local_file = open(self.config.PROCESS_DIR + filename, "a+")
            local_file.writelines(decrypted_file)

...

这有望在系统日志错误时导致脚本退出,然后您可以使用某种看门狗处理退出的容器,例如聊天中讨论的 --restart 选项。

我最终修改了这部分

if not self.setOutputSyslogHandler:
       syslogger.addHandler(syslog)
       self.setOutputSyslogHandler = True 

我修改它以删除处理程序并在每次再次使用它时添加它。

syslogger.addHandler(syslog)
for msg in decrypted_file.splitlines():
                if msg != '':
                    try:
                        syslogger.info(msg)
                    except:
                        self.logger.error('Error sending log file to syslog server %s on port %s via protocol %s', self.config.SYSLOG_ADDRESS, self.config.SYSLOG_PORT, self.config.SYSLOG_PROTO)
                        self.running = False
                        sys.exit(1)
while syslogger.hasHandlers():
      syslogger.removeHandler(syslogger.handlers[0])