web-dev-qa-db-ja.com

Heroku FlaskチュートリアルProcfileの意味

Heroku tutorial には、コードがあります

hello.py

_import os
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello World!'
_

およびProcfile:

_web: gunicorn hello:app --log-file=-_

本当に紛らわしいのは_hello:app_の部分です。 hellohello()関数またはhello.pyスクリプトを参照しますか?その意味に応じて、Procfileステートメント全体はどういう意味ですか?

18
Michael K

言及されたHerokuチュートリアルはもう利用できませんが、 Gunicornのドキュメント は良い最小限の例を示しています:

テストアプリの例:

def app(environ, start_response):
    """Simplest possible application object"""
    data = b'Hello, World!\n'
    status = '200 OK'
    response_headers = [
        ('Content-type', 'text/plain'),
        ('Content-Length', str(len(data)))
    ]
    start_response(status, response_headers)
    return iter([data])

これで、次のコマンドを使用してアプリを実行できます。

$ gunicorn --workers=2 test:app


試してみましょう、私のtest-directoryは次のようになります:

(.venv) 14:41 ~/testgunicorn % tree
.
├── requirements.txt
└── testpkg
    ├── __init__.py
    └── testfile.py

__init__.py

from flask import Flask
from .testfile import app

testfile.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def app(environ, start_response):
    """Simplest possible application object"""
    data = b'Hello, World!\n'
    status = '200 OK'
    response_headers = [
        ('Content-type', 'text/plain'),
        ('Content-Length', str(len(data)))
    ]
    start_response(status, response_headers)
    return iter([data])

間違った呼び出し

(.venv) 14:41 ~/testgunicorn % gunicorn testfile:app         
[2018-08-24 14:41:44 +0200] [27248] [INFO] Starting gunicorn 19.9.0
[2018-08-24 14:41:44 +0200] [27248] [INFO] Listening at: http://127.0.0.1:8000 (27248)
[2018-08-24 14:41:44 +0200] [27248] [INFO] Using worker: sync
[2018-08-24 14:41:44 +0200] [27251] [INFO] Booting worker with pid: 27251
[2018-08-24 14:41:44 +0200] [27251] [ERROR] Exception in worker process
Traceback (most recent call last):
  File "~/testgunicorn/.venv/lib/python3.6/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
    worker.init_process()
  File "~/testgunicorn/.venv/lib/python3.6/site-packages/gunicorn/workers/base.py", line 129, in init_process
    self.load_wsgi()
  File "~/testgunicorn/.venv/lib/python3.6/site-packages/gunicorn/workers/base.py", line 138, in load_wsgi
    self.wsgi = self.app.wsgi()
  File "~/testgunicorn/.venv/lib/python3.6/site-packages/gunicorn/app/base.py", line 67, in wsgi
    self.callable = self.load()
  File "~/testgunicorn/.venv/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 52, in load
    return self.load_wsgiapp()
  File "~/testgunicorn/.venv/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 41, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "~/testgunicorn/.venv/lib/python3.6/site-packages/gunicorn/util.py", line 350, in import_app
    __import__(module)
ModuleNotFoundError: No module named 'testfile'
[2018-08-24 14:41:44 +0200] [27251] [INFO] Worker exiting (pid: 27251)
[2018-08-24 14:41:44 +0200] [27248] [INFO] Shutting down: Master
[2018-08-24 14:41:44 +0200] [27248] [INFO] Reason: Worker failed to boot.
zsh: exit 3     gunicorn testfile:app    

良い呼びかけ

(.venv) 14:43 ~/testgunicorn % gunicorn testpkg:app 
[2018-08-24 14:43:56 +0200] [27302] [INFO] Starting gunicorn 19.9.0
[2018-08-24 14:43:56 +0200] [27302] [INFO] Listening at: http://127.0.0.1:8000 (27302)
[2018-08-24 14:43:56 +0200] [27302] [INFO] Using worker: sync
[2018-08-24 14:43:56 +0200] [27305] [INFO] Booting worker with pid: 27305
^C
(…)

(.venv) 15:03 ~/testgunicorn % cd testpkg    
(.venv) 15:03 fred@susa ~/git/ocp7/testpkg % gunicorn testfile:app
[2018-08-24 15:03:22 +0200] [27494] [INFO] Starting gunicorn 19.9.0
[2018-08-24 15:03:22 +0200] [27494] [INFO] Listening at: http://127.0.0.1:8000 (27494)
[2018-08-24 15:03:22 +0200] [27494] [INFO] Using worker: sync
[2018-08-24 15:03:22 +0200] [27497] [INFO] Booting worker with pid: 27497
^C
(…)

次に、このProcfile

web: gunicorn hello:app --log-file=-

Helloはhello()関数またはhello.pyスクリプトを参照しますか?

hello.pyスクリプトへ

その意味に応じて、Procfileステートメント全体はどういう意味ですか?

Herokuの Procfile形式のドキュメント 言います:

Procfileは、プロセスタイプを個々の行で宣言します。各行は次の形式です。

<process type>: <command>

  • <process type>は、web、worker、urgentworker、clockなどのコマンドの英数字の名前です。
  • <command>は、rake jobs:workなど、プロセスタイプのすべてのdynoが起動時に実行する必要があるコマンドを示します。

--logfile=-オプションは非推奨のようですが、ドキュメントで何も見つかりませんでした。使用すると、次のエラーが発生します。

(.venv) 15:34 ~/testgunicorn % heroku local web
[WARN] No ENV file found
15:34:30 web.1   |  usage: gunicorn [OPTIONS] [APP_MODULE]
15:34:30 web.1   |  gunicorn: error: unrecognized arguments: --logfile=-
15:34:30 web.1   Exited with exit code 2

この回答 によると、Herokuのstdoutにログインするためのオプションでした。

9
freezed

ProcFileには、herokuでアプリケーションを起動するためのコマンドラインが含まれています。完全なドキュメントはここにあります: https://devcenter.heroku.com/articles/procfile

この場合、herokuにgunicornを使用してhelloモジュールでアプリ変数(構築されたflask app))を使用し、Webプロセス(httpリクエストを処理できるもの)を開始するように指示しています。バックグラウンドワーカーなど、指定できる他のプロセスタイプ。

flaskアプリケーションオブジェクトはWSGIアプリケーションであり、任意のWSGIサーバーを使用して実行できます。Gunicornはherokuの選択肢の1つにすぎません。

6
Robert Moskal