Python 如何在docker上运行gunicorn

Python 如何在docker上运行gunicorn,python,docker,flask,gunicorn,Python,Docker,Flask,Gunicorn,当docker启动时,我有两个相互依赖的文件。1是一个flask文件,一个是一个具有几个函数的文件。docker启动时,只执行函数文件,但它会从flask文件导入flask变量。例如: 烧瓶文件 import flask from flask import Flask, request import json _flask = Flask(__name__) @_flask.route('/', methods = ['POST']) def flask_main(): s = st

当docker启动时,我有两个相互依赖的文件。1是一个flask文件,一个是一个具有几个函数的文件。docker启动时,只执行函数文件,但它会从flask文件导入flask变量。例如:

烧瓶文件

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)
  FROM python-flask
  ADD *.py *.pyc /code/
  ADD requirements.txt /code/
  WORKDIR /code
  EXPOSE 8080
  CMD ["python","main_file.py"]
主文件

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)
  FROM python-flask
  ADD *.py *.pyc /code/
  ADD requirements.txt /code/
  WORKDIR /code
  EXPOSE 8080
  CMD ["python","main_file.py"]
该脚本运行良好,无需使用gunicorn

Dockerfile

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)
  FROM python-flask
  ADD *.py *.pyc /code/
  ADD requirements.txt /code/
  WORKDIR /code
  EXPOSE 8080
  CMD ["python","main_file.py"]
在命令行中:我通常这样做:
docker run-it-p8080:8080 my_image\u name
,然后docker将启动并侦听

现在使用gunicorn: 我试图将dockerfile中的
CMD
参数修改为

["gunicorn", "-w", "20", "-b", "127.0.0.1:8083", "main_file:flaskfile"]

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

这是我使用Django应用程序编写docker文件的最后一部分

EXPOSE 8002
COPY entrypoint.sh /code/
WORKDIR /code
ENTRYPOINT ["sh", "entrypoint.sh"]
然后在entrypoint.sh中

#!/bin/bash

# Prepare log files and start outputting logs to stdout
mkdir -p /code/logs
touch /code/logs/gunicorn.log
touch /code/logs/gunicorn-access.log
tail -n 0 -f /code/logs/gunicorn*.log &

export DJANGO_SETTINGS_MODULE=django_docker_azure.settings

exec gunicorn django_docker_azure.wsgi:application \
    --name django_docker_azure \
    --bind 0.0.0.0:8002 \
    --workers 5 \
    --log-level=info \
    --log-file=/code/logs/gunicorn.log \
    --access-logfile=/code/logs/gunicorn-access.log \
"$@"

希望这会有用

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

我的Dockerfile中的命令是:

CMD ["gunicorn"  , "-b", "0.0.0.0:8000", "app:app"]
其中第一个“app”是模块,第二个“app”是WSGI可调用的名称,在您的情况下,它应该是您的代码中的一部分,尽管您还有其他一些事情让我不太确定

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

请注意,由Gunicorn运行时,
\uuuuuu name\uuuuu
不是“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”,并且在担心端口绑定到主机之前,不依赖于验证服务器是否启动

这是我的工作:

FROM docker.io/python:3.7

WORKDIR /app

COPY requirements.txt ./

RUN pip install --no-cache-dir -r requirements.txt

ENV GUNICORN_CMD_ARGS="--bind=0.0.0.0 --chdir=./src/"
COPY . .

EXPOSE 8000

CMD [ "gunicorn", "app:app" ]

gunicorn main:app--workers 4--bind:3000--access日志文件“-”

我也在尝试运行一个flask应用程序。我发现你可以用

ENTRYPOINT['gunicorn','-b',':8080','app:app']


这将获取您指定的文件并在docker实例上运行。另外,不要忘记顶部的shebang,
#/usr/bin/env python
如果您正在运行调试日志级别。

在过去3天中与此问题斗争之后,我发现您需要做的就是绑定到不可路由的元地址
0.0.0
,而不是环回IP
127.0.0.1

CMD[“gunicorn”、“--bind”、“0.0.0.0:8000”、“app:app”]

不要忘记公开端口,一个选项是使用expose 在Dockerfile中:

EXPOSE 8000
现在:

最后,您可以运行:

docker run -d -p 8000:8000 test

我这边的这部分会是什么样子
exec gunicorn django_docker_azure。wsgi:application
我可以使用
exec gunicorn my_docker_image吗。wsgi:application
?该部分与django应用程序相关,我使用过烧瓶,因此我无法给您提示。Sorry当容器退出时,您看到了什么错误?端口8080或8000?第二个示例只是为了快速调试,不会发生冲突-8000是设置为在CMD 8080或-p anyport:8000Thanks中正常运行的,这解决了我无法连接的问题。默认情况下,Gunicorn绑定到127.0.0.1,这是外部无法访问的(例如通过Docker的端口转发)。@Fax您的评论为我澄清了一些事情。非常感谢。请在你的答案中添加更多细节,试着解释提问者犯了什么错误,以及为什么你的解决方案有效。Thanks0.0.0.0表示:绑定所有可用接口,包括localhost,也称为“127.0.0.1”Thanks@kalou.net。请检查一下,现在修好了