簡體   English   中英

如何在 docker 上運行 gunicorn

[英]how to run gunicorn on docker

當 docker 啟動時,我有 2 個相互依賴的文件。 1是一個flask文件,一個是有幾個功能的文件。 當 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。

文件

  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 run -it -p 8080:8080 my_image_name將啟動並監聽。

現在使用 gunicorn:我嘗試將 dockerfile 中的CMD參數修改為

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

但它只是不斷退出。 我不是在寫 docker gunicorn 命令嗎?

本周我剛剛解決了這個問題,並在此過程中偶然發現了你的問題。 公平地說,你現在要么解決了這個問題,要么改變了方法,但為了未來:

我的 Dockerfile 中的命令是:

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

第一個“應用程序”是模塊,第二個“應用程序”是可調用 WSGI 的名稱,在您的情況下,它應該是代碼中的 _flask,盡管您還有其他一些事情讓我不太確定。

Gunicorn 取代了代碼中的所有運行語句,如果 Flask 的開發 Web 服務器和 Gunicorn 嘗試使用相同的端口,它可能會發生沖突並導致 Gunicorn 崩潰。

請注意,當由__name__運行時, __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”並且在擔心之前沒有用於驗證服務器是否啟動的依賴項關於綁定到主機的端口。

在過去 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

這是我的 Dockerfile 與 Django App 的最后一部分

EXPOSE 8002
COPY entrypoint.sh /code/
WORKDIR /code
ENTRYPOINT ["sh", "entrypoint.sh"]

然后在入口點.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" ]

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

我也試圖運行一個燒瓶應用程序。 我發現你可以使用

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

這將采用您指定的文件並在 docker 實例上運行。 另外,如果您正在運行調試日志級別,請不要忘記頂部的 shebang, #!/usr/bin/env python

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM