Python 带有Flask服务器的Docker容器在大约20个请求后停止响应

Python 带有Flask服务器的Docker容器在大约20个请求后停止响应,python,docker,flask,tensorflow,flask-restful,Python,Docker,Flask,Tensorflow,Flask Restful,我有一个docker容器,它接收图像的URL,使用urllib2将图像下载到内存中,使用Tensorflow对其进行一些处理,然后返回JSON数据 代码的结构如下所示: myapp.py from flask import Flask from flask_restful import reqparse, abort, Api, Resource, inputs import my_tensorflow app = Flask(__name__) api = Api(app) parser =

我有一个docker容器,它接收图像的URL,使用
urllib2
将图像下载到内存中,使用Tensorflow对其进行一些处理,然后返回JSON数据

代码的结构如下所示:

myapp.py

from flask import Flask
from flask_restful import reqparse, abort, Api, Resource, inputs
import my_tensorflow
app = Flask(__name__)
api = Api(app)
parser = reqparse.RequestParser()
parser.add_argument('url')
class MyApp(Resource):
  def post(self):
    c = my_tensorflow.MyTensorflow(args['url'])
        c.create_graph()
        returned = c.run_inference_on_image()
        return {'results': returned}
api.add_resource(MyApp, '/myapp')
if __name__ == '__main__':
   port = int(os.environ.get('PORT', 5000))
   app.run(host='0.0.0.0', port=port)
import numpy as np
import tensorflow as tf
import urllib2

class MyTensorflow:

  def __init__(self, url):
     self.imageUrl = imageUrl

  def create_graph(self):
    with tf.gfile.FastGFile("/path/to/model.pb", 'rb') as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())
        _ = tf.import_graph_def(graph_def, name='')

   def run_inference_on_image(self):
     image_string = urllib2.urlopen(self.imageUrl).read()
     with tf.Session() as sess:
       ...
       ...
       return a_text_value
my_tensorflow.py

from flask import Flask
from flask_restful import reqparse, abort, Api, Resource, inputs
import my_tensorflow
app = Flask(__name__)
api = Api(app)
parser = reqparse.RequestParser()
parser.add_argument('url')
class MyApp(Resource):
  def post(self):
    c = my_tensorflow.MyTensorflow(args['url'])
        c.create_graph()
        returned = c.run_inference_on_image()
        return {'results': returned}
api.add_resource(MyApp, '/myapp')
if __name__ == '__main__':
   port = int(os.environ.get('PORT', 5000))
   app.run(host='0.0.0.0', port=port)
import numpy as np
import tensorflow as tf
import urllib2

class MyTensorflow:

  def __init__(self, url):
     self.imageUrl = imageUrl

  def create_graph(self):
    with tf.gfile.FastGFile("/path/to/model.pb", 'rb') as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())
        _ = tf.import_graph_def(graph_def, name='')

   def run_inference_on_image(self):
     image_string = urllib2.urlopen(self.imageUrl).read()
     with tf.Session() as sess:
       ...
       ...
       return a_text_value
这个容器可以处理大约20个请求。在大约20个请求之后,它停止响应,只响应“内部服务器错误”。我似乎无法解决这个问题。我在代码中输入print语句以查看它在哪里变得无响应或出错,但没有一个print语句显示在
docker日志中

docker日志
没有显示任何有趣的内容。下面是它显示的内容:

172.17.42.1 - - [13/Feb/2017 21:12:02] "POST /myapp HTTP/1.1" 500 -
当容器变得无响应时(响应为
内部服务器错误
),
docker stats
返回以下信息:

CONTAINER                  CPU %               MEM USAGE/LIMIT     MEM %               NET I/O
docker_container   0.01%               2.475 GB/8.255 GB   29.99%              5.328 MB/2.036 MB
使用
docker restart
重新启动容器后,一切都会重新开始工作


我不确定会出现什么问题以及如何解决问题?

可能
docker events
会显示一些内容尝试在交互模式下运行容器(而不是运行分离并使用
docker logs
查看日志)。运行分离时,输出会被缓冲,并且(以我的经验来说)有时会丢失一些东西,或者挂起并永远不会打印,因为缓冲区不够满。当运行attached时,您没有缓冲问题。是的,我也会尝试从容器中运行,看看这是否是docker网络问题。您可以在运行容器时使用
--net=host
来使用主机网络堆栈(即没有网络名称空间)。