症状
画像認識アプリをFlaskでつくった。
一見Herokuデプロイはうまくいったかに見える。
しかし以下の画面。
ログを確認。
app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/cv2/__init__.py", line 4, in <module>
app[web.1]: from .cv2 import *
app[web.1]: ImportError: libSM.so.6: cannot open shared object file: No such file or directory
app[web.1]: [4] [INFO] Shutting down: Master
app[web.1]: [4] [INFO] Reason: Worker failed to boot.
heroku[web.1]: Process exited with status 3
heroku[web.1]: State changed from up to crashed
heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=xxxx.herokuapp.com request_id=xxxxx-xxxx-xxxx-xxxx-xxxxxxxx fwd="xx.xxx.xx.xx" dyno= connect= service= status=503 bytes= protocol=https
なんやこれ。
エラーの原因
なんかimport cv2
っぽいんでコメントアウトしたらエラー解決。
※まあ、もちろんcv2がないのでpythonが動かんのだが。。
ということで、つまりimport cv2
が原因。
Heroku環境でopenCVをインストールできていなかったということだろう。
でどうやってOpenCVをHerokuにインストールするのか
ちゃんとrequirements.txt
にopencv-pythonはあるのに。。
requirements.txt
Flask==0.12
gunicorn==19.7.1
Jinja2==2.9.4
numpy==1.14.1
opencv-python==3.4.0.12
tensorflow==1.5.0
いろいろ調べているとDocker
もしくはheroku.yml
をつかってHerokuにOpenCVをインストールせねばらならんらしい。
Docker知らんし、heroku.ymlでやろう!
以下のファイルを作成。
heroku.yml
build:
languages:
- python
packages:
- libopencv-dev
run:
web: gunicorn web:app --log-file=-
※runtime.txt
、Procfile
、requirement.txt
はそのままで大丈夫大丈夫。。
で、
$ git add -A
$ git commit -m "heroku.yml やったったで"
$ heroku stack:set container
$ git push heroku master
するとHerokuにズコズコopenCVが入ってきます!
いっちょ上がりです!