如何在d上运行gunicorn

2024-05-31 23:58:05 发布

您现在位置:Python中文网/ 问答频道 /正文

docker启动时,我有两个相互依赖的文件。1是一个烧瓶文件,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)

剧本运行良好,不需要枪炮。

文档文件

  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命令吧?


Tags: 文件dockerrunnameimportflask烧瓶main
3条回答

这是我与Django应用程序的Dockerfile的最后一部分

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

希望这有用

我的工作是:

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

我这周刚看完这个问题,一路上无意中发现了你的问题。公平地说,你现在要么解决了这个问题,要么改变了方法,但为了将来:

我的Dockerfile中的命令是:

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

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

Gunicorn取代了代码中的所有run语句,如果Flask的开发web服务器和Gunicorn尝试使用相同的端口,则可能会发生冲突并导致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”,并且在担心端口绑定到主机之前不依赖于验证服务器是否启动。

相关问题 更多 >