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/