Open7

django のコンテナを heroku にデプロイしたい

tkttkt
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?
tkttkt

Dockerfile で記述して install しているはずの modules を読み込んでくれない

tkttkt
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("-", "_")

tkttkt

poetry install で再度いれて確認しようとしても謎のエラーで入らない
poetry config virtualenvs.create false && を外せば実行はできるけど仮想環境で実行される

ChanmoroChanmoro

こんにちは!
僕も似た問題でハマったのですが、docker ビルド時に root ユーザーで poetry install を実行している場合、heroku でのコンテナ実行時のユーザーは root ではない別の uid のユーザーになることが原因でした。
これによって poetry の仮想環境のパスが docker ビルド時とコンテナ実行時で違うものになってしまい、コンテナ実行時にはライブラリがインストールされない状態になってしまいます。

解決策としては POETRY_CACHE_DIR で仮想環境が保存されるパスを固定するか、 Dockerfile 内でvirtualenvs.create を false に設定してグローバルな領域にライブラリをインストールするかどちらかで解決できます。

※詳細こちらにまとめています
https://zenn.dev/link/comments/c890ea0ecee4f9

tkttkt

情報ありがとうございます!

ただ、当時試した際には
https://github.com/tktcorporation/ObonHackathonBackend/blob/a9d26b0286ba683905f094d1033f0fb78f8f694c/Dockerfile#L19
としてもうまく動かなかった記憶があるので、別条件も絡んでくるのかも…?とも思ってしまいました…!

また同様の環境を作成する際には参考にさせていただいて、またここに記録を残させていただきます!
ありがとうございます!