web-dev-qa-db-ja.com

ドッカーでgunicornを実行する方法

Dockerの起動時に互いに依存する2つのファイルがあります。 1はflaskファイルであり、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)

スクリプトは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その後、ドッカーが起動してリッスンします。

次にgunicornを使用します:dockerfileのCMDパラメーターを次のように変更しようとしました。

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

しかし、ただ終了し続けます。 docker gunicornコマンドを正しく書いていませんか?

6
jxn

私は今週この問題を経験しましたが、途中であなたの質問につまずきました。これを解決したか、今までにアプローチを変更したかのどちらかですが、将来のために:

Dockerfileのコマンドは次のとおりです。

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

最初の「アプリ」はモジュールで、2番目の「アプリ」はWSGI呼び出し可能オブジェクトの名前です。あなたの場合は、should be _flask from your codeそれは私を不確実にします。

Flaskの開発WebサーバーとGunicornが同じポートを使用しようとすると、Gunicornが競合してクラッシュする可能性があるため、Gunicornはコード内のすべてのrunステートメントの代わりになります。

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ファイルに基本的なルートを保持します。ホストマシンへのポートバインディングについて。

17
user7504939

これは、Django Appを使用した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 \
"$@"

これが役立つことを願っています

1
e.arbitrio

私のためのこの仕事:

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