現象
dockerでpoetry install して環境構築し、コンテナ内で poetry shell で仮想環境を起動すると “environment seems to be broken" と言われる。その後pythonを使用してもインストールしたモジュールが ModuleNotFoundError でインポートできない。
dockerfile
FROM python:3.9.5-slim-buster
WORKDIR /app
RUN apt update && apt install -y \
curl \
libgl1-mesa-glx \
libglib2.0-dev
ENV PYTHONDONTWRITEBYTECODE=1 \
POETRY_VERSION=1.3.2 \
PYTHONUNBUFFERED=1
ENV POETRY_HOME=/opt/poetry \
POETRY_VIRTUALENVS_CREATE=true
ENV PATH=$POETRY_HOME/bin:$PATH
RUN curl -sSL https://install.python-poetry.org/ | python -
COPY ./myproj .
RUN poetry install
解決法
ローカルで作成した .venv を削除し、 dockerfile を再ビルドしたら動くようになった。
原因考察
ローカルのファイル変更内容をすぐに反映するために、Dockerにボリュームマウントをしていた。マウントしたフォルダの中にはローカルのpoetryで作成した.venv 環境フォルダがあった。poetry はデフォルトで .venv の環境を見に行くが、これはコンテナ外で生成されたもの。
そのため、コンテナにボリュームマウントした際に、ローカルで作成した.venv 環境を Docker内で使用しようとしてエラーになった。 ようだ。。。
反省
poetry 使うなら、コンテナの中で使うか、外で使うか、どっちかにする。