発端
自身のlocal環境に .venv を作成しました。
そして、元々開発で使っていた poetry dev コンテナを立ち上げた時、
ホストの .venv がコンテナの .venv にバインドされて壊れてしまいました。
気が効く poetry は仮想環境の再構築を始めました。
(ここまではありそうな話の想定)
しかし、poetry は想定外の仮想環境の構築をし始めてしまいました
root@e4a563668462:/var/www# poetry run uvicorn apps.main:app --reload --host 0.0.0.0
The virtual environment found in /var/www/.venv seems to be broken.
Recreating virtualenv www-p9HyaoIY-py3.9 in /root/.cache/pypoetry/virtualenvs/www-p9HyaoIY-py3.9
FileNotFoundError
[Errno 2] No such file or directory: b'/bin/uvicorn'
at /usr/local/lib/python3.9/os.py:607 in _execvpe
603│ path_list = map(fsencode, path_list)
604│ for dir in path_list:
605│ fullname = path.join(dir, file)
606│ try:
→ 607│ exec_func(fullname, *argrest)
608│ except (FileNotFoundError, NotADirectoryError) as e:
609│ last_exc = e
610│ except OSError as e:
611│ last_exc = e
現在ディレクトリに .venv を作ってもらうにはどうしたら良いかというお話です。
poetry config を設定し直し、 .venv を再構築してパッケージを入れ直す
virtualenvs.in-project を true に修正することで、現在ディレクトリに .venv を作ってくれました。
root@531b098ed9d3:/var/www# poetry config --list
cache-dir = "/root/.cache/pypoetry"
experimental.new-installer = true
installer.parallel = true
virtualenvs.create = true
virtualenvs.in-project = null
virtualenvs.path = "{cache-dir}/virtualenvs" # /root/.cache/pypoetry/virtualenvs
root@531b098ed9d3:/var/www# poetry config virtualenvs.in-project true
root@531b098ed9d3:/var/www# poetry config --list
cache-dir = "/root/.cache/pypoetry"
experimental.new-installer = true
installer.parallel = true
virtualenvs.create = true
virtualenvs.in-project = true
virtualenvs.path = "{cache-dir}/virtualenvs" # /root/.cache/pypoetry/virtualenvs
root@531b098ed9d3:/var/www# poetry install
The virtual environment found in /var/www/.venv seems to be broken.
Recreating virtualenv www in /var/www/.venv
Installing dependencies from lock file
Package operations: 60 installs, 0 updates, 0 removals
• Installing certifi (2021.10.8)
• Installing charset-normalizer (2.0.7)
• Installing idna (3.3)
この後無事パッケージ install が進み、 uvicorn が起動してくれました。
参考
poetry の設定のリファレンス