Open7
django のコンテナを heroku にデプロイしたい
これを heroku に上げているんだけど、全然あがらない
2021-08-14T22:55:54.043906+00:00 heroku[web.1]: Starting process with command `/bin/bash -c poetry\ config\ virtualenvs.create\ false\ \&\&\ poetry\ run\ /app/manage.py\ runserver\ 0.0.0.0:\31842`
2021-08-14T22:55:57.652744+00:00 app[web.1]: Skipping virtualenv creation, as specified in config file.
2021-08-14T22:55:57.695250+00:00 app[web.1]: Traceback (most recent call last):
2021-08-14T22:55:57.695258+00:00 app[web.1]: File "/app/manage.py", line 11, in main
2021-08-14T22:55:57.695323+00:00 app[web.1]: from django.core.management import execute_from_command_line
2021-08-14T22:55:57.695347+00:00 app[web.1]: ModuleNotFoundError: No module named 'django'
2021-08-14T22:55:57.695355+00:00 app[web.1]:
2021-08-14T22:55:57.695355+00:00 app[web.1]: The above exception was the direct cause of the following exception:
2021-08-14T22:55:57.695355+00:00 app[web.1]:
2021-08-14T22:55:57.695356+00:00 app[web.1]: Traceback (most recent call last):
2021-08-14T22:55:57.695364+00:00 app[web.1]: File "/app/manage.py", line 22, in <module>
2021-08-14T22:55:57.695418+00:00 app[web.1]: main()
2021-08-14T22:55:57.695426+00:00 app[web.1]: File "/app/manage.py", line 13, in main
2021-08-14T22:55:57.695473+00:00 app[web.1]: raise ImportError(
2021-08-14T22:55:57.695496+00:00 app[web.1]: ImportError: Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment?
Dockerfile で記述して install しているはずの modules を読み込んでくれない
heroku run "poetry config virtualenvs.create false && poetry install" -a {APP_NAME}
› Warning: heroku update available from 7.54.1 to 7.56.1.
Running poetry config virtualenvs.create false && poetry install on ⬢ obon-de-hackathon... up, run.5991 (Free)
Skipping virtualenv creation, as specified in config file.
TypeError
expected string or bytes-like object
at /usr/local/lib/python3.9/site-packages/poetry/core/utils/helpers.py:27 in canonicalize_name
23│ _canonicalize_regex = re.compile(r"[-_]+")
24│
25│
26│ def canonicalize_name(name): # type: (str) -> str
→ 27│ return _canonicalize_regex.sub("-", name).lower()
28│
29│
30│ def module_name(name): # type: (str) -> str
31│ return canonicalize_name(name).replace(".", "_").replace("-", "_")
poetry install
で再度いれて確認しようとしても謎のエラーで入らない
poetry config virtualenvs.create false &&
を外せば実行はできるけど仮想環境で実行される
こんにちは!
僕も似た問題でハマったのですが、docker ビルド時に root ユーザーで poetry install
を実行している場合、heroku でのコンテナ実行時のユーザーは root ではない別の uid のユーザーになることが原因でした。
これによって poetry の仮想環境のパスが docker ビルド時とコンテナ実行時で違うものになってしまい、コンテナ実行時にはライブラリがインストールされない状態になってしまいます。
解決策としては POETRY_CACHE_DIR
で仮想環境が保存されるパスを固定するか、 Dockerfile 内でvirtualenvs.create
を false に設定してグローバルな領域にライブラリをインストールするかどちらかで解決できます。
※詳細こちらにまとめています
情報ありがとうございます!
ただ、当時試した際には
としてもうまく動かなかった記憶があるので、別条件も絡んでくるのかも…?とも思ってしまいました…!また同様の環境を作成する際には参考にさせていただいて、またここに記録を残させていただきます!
ありがとうございます!