如何在 docker 上运行 gunicorn

新手上路,请多包涵

当 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 许可协议

阅读 1.6k
2 个回答

我这周刚刚经历了这个问题,一路上偶然发现了你的问题。公平地说,您现在要么解决了这个问题,要么改变了方法,但为了未来:

我的 Dockerfile 中的命令是:

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

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

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

请注意,当由 Gunicorn 运行时, __name__ 不是“主要”。在我的示例中,它等于“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”,并且在担心之前没有验证服务器是否启动的依赖项关于绑定到主机的端口。

原文由 user7504939 发布,翻译遵循 CC BY-SA 3.0 许可协议

在过去 3 天努力解决这个问题后,我发现您需要做的就是绑定到不可路由的元地址 0.0.0.0 而不是环回 IP 127.0.0.1

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

并且不要忘记公开端口,一种选择是在 Dockerfile 中使用 EXPOSE:

 EXPOSE 8000

现在:

 docker build -t test .

最后你可以运行:

 docker run -d -p 8000:8000 test

原文由 Mohamad Al Mdfaa 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题