① 結論
結論:Dockerコンテナ内で pip install が成功しているにも関わらず import できない場合、原因の大半はイメージ作成時にライブラリが入っていない、または実行しているPythonとpipの紐づけが一致していないことです。特に「Dockerfileでpip installしていない」「pythonとpipの不一致」「docker-composeのボリュームマウントによる上書き」が頻発します。Dockerfileと実行環境を基準に切り分ければ確実に解決できます。
② 症状
- コンテナ内で
ModuleNotFoundErrorが発生する - Dockerfileで
pip installしたはずなのにimportできない - ホスト環境では動くが、Docker内では動かない
- 再ビルドすると直る場合と直らない場合がある
③ 原因(最大3つ)
原因①:Dockerfileでpip installしていない(イメージに反映されていない)
【詳細】
Dockerではイメージ作成時(docker build)にライブラリをインストールする必要があります。コンテナ起動後に手動で pip install しても、その状態は次回起動時に保持されません。Dockerfileに RUN pip install が無い、またはキャッシュにより反映されていないと、ライブラリが存在しない状態になります。
起きやすい条件:Dockerfile修正後にbuildしていない、キャッシュを意識していない場合
判断ポイント:
docker exec -it コンテナ名 python -c "import パッケージ名"
ここで失敗する場合、イメージにライブラリが入っていません。
原因②:pythonとpipの実行バイナリが一致していない
【詳細】
Dockerイメージ内でも python と python3、pip と pip3 が混在することがあります。pipが別のPythonに紐づいていると、インストール自体は成功しても、実行Pythonからはライブラリを参照できません。
起きやすい条件:ベースイメージの違い、alpine/debian系混在
判断ポイント:
which python
which pip
python -m pip --version
python -m pip のパスと which python が一致していなければ不一致です。
原因③:docker-composeのボリュームマウントで環境を上書きしている
【詳細】
docker-compose.yml の volumes 設定により、コンテナ内のディレクトリがホスト側で上書きされることがあります。その結果、イメージ作成時にインストールしたライブラリや仮想環境が見えなくなり、import に失敗します。
起きやすい条件:開発用compose構成、venvをコンテナ内に作成している場合
判断ポイント:
docker compose config
で volumes のマウント先を確認します。
④ 切り分け手順(コマンド付き)
- コンテナに入る:
-
docker exec -it コンテナ名 /bin/bash - 実行中のPythonとpipを確認:
-
which python -
python -m pip --version - 直接importを確認:
-
python -c "import パッケージ名; print('ok')" - Dockerfileにpip installがあるか確認:
-
grep -n "pip install" Dockerfile
⑤ 解決方法
解決策①:Dockerfileで python -m pip install を実行する
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN python -m pip install --upgrade pip \
&& python -m pip install -r requirements.txt
COPY . .
解決策②:キャッシュを無効にして再ビルド
docker build --no-cache -t イメージ名 .
解決策③:ボリュームマウントを見直す
ライブラリやvenvを含むディレクトリをホストで上書きしない構成に変更します。
⑥ 再発防止
- 依存関係は必ずDockerfileで管理する
pipではなくpython -m pipを使う- composeの
volumesは最小限にする
⑦ それでもダメな場合
- 最小構成のDockerfileで再現確認する
FROM python:3.11-slim
RUN python -m pip install requests
CMD ["python", "-c", "import requests; print('ok')"]
- それでも失敗する場合は、ベースイメージ自体の変更を検討する

コメント