docker启动时,我有两个相互依赖的文件。 1是Flask文件,一个是具有一些功能的文件。当docker启动时,只会执行功能文件,但会从flask文件中导入flask变量。例:

Flaskfile

import flask
from flask import Flask, request
import json

_flask = Flask(__name__)

@_flask.route('/', methods = ['POST'])
def flask_main():
    s = str(request.form['abc'])
    ind = global_fn_main(param1,param2,param3)
    return ind

def run(fn_main):
    global global_fn_main
    global_fn_main = fn_main
    _flask.run(debug = False, port = 8080, host = '0.0.0.0', threaded = True)

主文件
import flaskfile
#a few functions then
if__name__ == '__main__':
    flaskfile.run(main_fn)

该脚本运行良好,无需使用大炮。

Dockerfile
  FROM python-flask
  ADD *.py *.pyc /code/
  ADD requirements.txt /code/
  WORKDIR /code
  EXPOSE 8080
  CMD ["python","main_file.py"]

在命令行中:我通常这样做:docker run -it -p 8080:8080 my_image_name,然后docker将启动并监听。

现在使用gunicorn:
我试图将dockerfile中的CMD参数修改为
["gunicorn", "-w", "20", "-b", "127.0.0.1:8083", "main_file:flaskfile"]

但它一直在退出。我不是在写docker gunicorn命令吗?

最佳答案

我本周刚刚经历了这个问题,一路上偶然发现了您的问题。可以说您现在已经解决了这个问题或改变了方法,但是为了将来的缘故:

我的Dockerfile中的命令是:

CMD ["gunicorn"  , "-b", "0.0.0.0:8000", "app:app"]

在您的情况下,第一个“应用程序”是模块,第二个“应用程序”是可调用的WSGI的名称,但是您的代码中应该是_flask,但它是,尽管您还有其他事情使我不太确定。

如果Flask的开发Web服务器和Gunicorn尝试使用相同的端口,则Gunicorn会取代代码中所有run语句,否则Gunicorn可能会发生冲突并崩溃。

请注意,当由Gunicorn运行时,__name__不是“main”。在我的示例中,它等于“app”。

在我公认的Python,Docker和Gunicorn的初级级别上,调试的最快方法是注释掉Dockerfile中的“CMD”,启动并运行容器:
docker run -it -d -p 8080:8080 my_image_name

跳到正在运行的容器上:
 docker exec -it container_name /bin/bash

然后从命令行启动Gunicorn,直到它可以正常工作,然后使用curl进行测试-我在app.py文件中保留了一条基本路由,该文件只打印出“Hi”,并且没有依赖关系来验证服务器是否在担心之前有关绑定(bind)到主机的端口的信息。

关于python - 如何在docker上运行gunicorn,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43925487/

10-16 23:00