蛇ノ目の記

技術のことも。そうでないことも。

herokuのProcfileに書くgunicornのコマンドにハマった話

herokuで動かすWebアプリがどんなプロセスを使うかを定義するProcfile

Procfileはドキュメントルートに置き、例えばFlask + gunicornを使うときには web: gunicorn app:appとする。古事記にもそう書いてある(heroku公式ドキュメントやいろいろなブログ)

heroku公式ドキュメント: Deploying Python Applications with Gunicorn | Heroku Dev Center

その教えに従ってProcfileを作成したが一向に動かない。

Failed to find application object 'app' in 'myapp'

と表示されるばかり。

ディレクトリ構成はこんな感じ。

flask_app
├ Procfile
├ requirements.txt
├ runtime.txt
└ myapp
  ├ myapp.py
  ├ static
  └ templates

一度myappディレクトリに移動する必要があるのでは、と考えて

web: gunicorn --chdir myapp myapp:app

と書き換えたところアプリが正常に動いた。

作ったWebアプリの話はまた後日。

追記

アプリのディレクトリを分けずに以下のようなディレクトリ構成にすることで、Procfileにディレクトリ移動を書かなくてよくなる。アプリのディレクトリを分けているとローカルでの実行やパッケージングで不便になる、と@shimizukawaからアドバイスをもらった。ありがとうございます。

flask_app
├ Procfile
├ requirements.txt
├ runtime.txt
├ myapp.py
├ static
├ templates

また、herokuの環境変数PYTHONPATHをPYTHONPATH=myappsと設定すると、アプリのディレクトリを分けていてもProcfile実行時のディレクトリ移動が必要なくなる。と@shimizukawaからアドバイスをもらった。ありがとうございます。