当 docker 启动时,我有 2 个相互依赖的文件。 1 是一个烧瓶文件,一个是具有几个功能的文件。当 docker 启动时,只会执行函数文件,但它会从烧瓶文件中导入烧瓶变量。例子:
烧瓶文件
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)
该脚本运行良好,无需 gunicorn。
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 命令吗?
原文由 jxn 发布,翻译遵循 CC BY-SA 4.0 许可协议
我这周刚刚经历了这个问题,一路上偶然发现了你的问题。公平地说,您现在要么解决了这个问题,要么改变了方法,但为了未来:
我的 Dockerfile 中的命令是:
第一个“app”是模块,第二个“app”是 WSGI 可调用的名称,在您的情况下,它 应该 是代码中的 _flask,尽管您还有其他一些事情让我不太确定。
Gunicorn 取代了代码中的所有运行语句,如果 Flask 的开发 Web 服务器和 Gunicorn 尝试使用相同的端口,它可能会发生冲突并导致 Gunicorn 崩溃。
请注意,当由 Gunicorn 运行时,
__name__
不是“主要”。在我的示例中,它等于“app”。在我公认的 Python、Docker 和 Gunicorn 初级水平上,最快的调试方法是注释掉 Dockerfile 中的“CMD”,让容器启动并运行:
跳到正在运行的容器:
并从命令行启动 Gunicorn,直到你让它工作,然后用 curl 测试——我在我的 app.py 文件中保留了一个基本路由,它只打印出“Hi”,并且在担心之前没有验证服务器是否启动的依赖项关于绑定到主机的端口。