Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法从Docker容器外部的Python程序中获取引发的错误并对其进行处理?_Python_Docker_Flask_Error Handling_Subprocess - Fatal编程技术网

有没有办法从Docker容器外部的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

我有一个运行Python程序的容器,它可以通过两种方式运行:在本地主机终端中使用
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命令(它容易出错,不灵活,不可维护,容易受到攻击)

您可以做什么:

  • 不要直接通过Docker调用您的子流程,而是将它封装在另一个API中,您可以在容器中与第一个服务并行运行,并从一个服务到另一个服务进行HTTP调用或类似调用。您将能够更高效地处理错误(例如HTTP错误代码和负载),并且不会受到bash注入攻击
  • 如果继续使用sub命令调用,则根据
    stderr
    中的错误和日志异常,可以返回子程序和错误代码。在调用者程序中,您可以轻松地处理错误代码和
    stderr
    输出,以记录错误代码并执行特殊操作

您所展示的代码中有一个微不足道的shell注入攻击,它允许攻击者轻而易举地接管机器。(例如,将
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或其他)启动要好。好的,我明白了,谢谢您的帮助!!谢谢你的回复,皮埃尔!!谢谢你的回复,皮埃尔!!