如何在码头上运行gunicorn

时间:2017-05-11 21:03:17

标签: python docker flask gunicorn

启动docker时,我有2个相互依赖的文件。 1是一个烧瓶文件,一个是具有一些功能的文件。当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命令吗?

6 个答案:

答案 0 :(得分:13)

我本周刚刚遇到这个问题,并且在路上偶然发现了你的问题。可以说你现在已经解决了这个问题或改变了方法,但是为了将来的原因:

我的Dockerfile中的命令是:

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

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

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

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

在我认可的初级Python,Docker和Gunicorn中,最快的调试方法是评论" CMD"在Dockerfile中,启动并运行容器:

docker run -it -d -p 8080:8080 my_image_name

跳到正在运行的容器上:

 docker exec -it container_name /bin/bash

从命令行启动Gunicorn,直到你完成它的工作,然后用curl测试 - 我在app.py文件中保留了一条基本路线,只打印出来"嗨"在担心端口绑定到主机之前,没有用于验证服务器的依赖关系。

答案 1 :(得分:4)

在过去三天中为解决此问题而苦苦挣扎之后,我发现您需要做的就是绑定回送而不是本地主机:

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

别忘了公开端口,一种选择是使用EXPOSE 在您的Dockerfile中:

EXPOSE 8000

现在:

docker build -t test .

最后您可以运行:

docker run -d -p 8000:8000 test

答案 2 :(得分:0)

这是我使用Django App的Dockerfile的最后一部分

#!/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 \
"$@"

然后在entrypoint.sh

{{1}}

希望这可能有用

答案 3 :(得分:0)

为我工作:

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" ]

答案 4 :(得分:0)

我也试图运行Flask应用程序。我发现您可以使用

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

这将采用您指定的文件并在docker实例上运行。另外,如果您正在运行Debug LOG-LEVEL,请不要忘记顶部的#!/usr/bin/env python弹出框。

答案 5 :(得分:-1)

gunicorn main:app --workers 4 --bind:3000 --access-logfile'-'