有没有办法从Docker容器外部的Python程序中获取引发的错误并对其进行处理?
我有一个运行Python程序的容器,它可以通过两种方式运行:在本地主机终端中使用有没有办法从Docker容器外部的Python程序中获取引发的错误并对其进行处理?,python,docker,flask,error-handling,subprocess,Python,Docker,Flask,Error Handling,Subprocess,我有一个运行Python程序的容器,它可以通过两种方式运行:在本地主机终端中使用docker exec,或者通过发出API Rest请求(在容器外部),该请求执行与使用第一种方法相同的命令。我试图做的是,每当容器中的Python程序出现错误时,API就会注意到它 Python程序中正在进行的错误处理是使用logging.exception在终端和API中打印错误消息和回溯,我正在使用子流程方法使docker exec(我知道最好使用docker Compose和services,但现在不行) t
docker exec
,或者通过发出API Rest请求(在容器外部),该请求执行与使用第一种方法相同的命令。我试图做的是,每当容器中的Python程序出现错误时,API就会注意到它
Python程序中正在进行的错误处理是使用logging.exception在终端和API中打印错误消息和回溯,我正在使用子流程方法使docker exec
(我知道最好使用docker Compose和services,但现在不行)
try/catch-inside-Docker容器程序:
。。。
尝试:
... 某物
除IOE错误外:
self._log.exception(“我的程序中出错\n{}”.format(e))
API函数:
。。。
尝试:
CMD=“docker exec”
子进程检查输出(CMD,shell=True)
返回{'response':'Done'},200
例外情况除外,如e:
返回{'response':'Error{}'。格式(e)},500
我希望API函数捕获Docker容器中引发的异常。或者,如果没有其他方法可以这样做。正如评论中指出的,您不应该直接在网络请求上使用Docker命令(它容易出错,不灵活,不可维护,容易受到攻击) 您可以做什么:
- 不要直接通过Docker调用您的子流程,而是将它封装在另一个API中,您可以在容器中与第一个服务并行运行,并从一个服务到另一个服务进行HTTP调用或类似调用。您将能够更高效地处理错误(例如HTTP错误代码和负载),并且不会受到bash注入攻击
- 如果继续使用sub命令调用,则根据
中的错误和日志异常,可以返回子程序和错误代码。在调用者程序中,您可以轻松地处理错误代码和stderr
输出,以记录错误代码并执行特殊操作stderr
- 不要直接通过Docker调用您的子流程,而是将它封装在另一个API中,您可以在容器中与第一个服务并行运行,并从一个服务到另一个服务进行HTTP调用或类似调用。您将能够更高效地处理错误(例如HTTP错误代码和负载),并且不会受到bash注入攻击
- 如果继续使用sub命令调用,则根据
中的错误和日志异常,可以返回子程序和错误代码。在调用者程序中,您可以轻松地处理错误代码和stderr
输出,以记录错误代码并执行特殊操作stderr
params
设置为;docker run-v/:/host busybox cat/host/etc/shadow
)我会尽最大努力避免使用docker响应网络请求。是的,你是正确的,这不是更好的方法。谢谢你的回复,我马上就改。因此,除了这个问题之外,您是否建议通过让docker编写并使用服务来更好地处理错误?如果您可以通过HTTP请求调用服务,这往往比尝试将其作为子进程(docker或其他)启动要好。好的,我明白了,谢谢您的帮助!!您所展示的代码有一个简单的shell注入攻击,它允许攻击者简单地接管机器。(例如,将params
设置为;docker run-v/:/host busybox cat/host/etc/shadow
)我会尽最大努力避免使用docker响应网络请求。是的,你是正确的,这不是更好的方法。谢谢你的回复,我马上就改。因此,除了这个问题之外,您是否建议通过让docker编写并使用服务来更好地处理错误?如果您可以通过HTTP请求调用服务,这往往比尝试将其作为子进程(docker或其他)启动要好。好的,我明白了,谢谢您的帮助!!谢谢你的回复,皮埃尔!!谢谢你的回复,皮埃尔!!