Dockerで requirements.txt が反映されない原因と解決方法|pip install -r が効かない場合

Dockerで requirements.txt が反映されない原因と解決方法|pip install -r が効かない場合

① 結論

Dockerで pip install -r requirements.txt を実行しているのに、
コンテナ内でライブラリが import できない原因の多くは、
「Dockerイメージのキャッシュ」「COPYの順序ミス」「ビルドと実行の環境ズレ」です。

特に多いのは Dockerのレイヤーキャッシュが効いて requirements.txt が再インストールされていないケースです。
まずは docker build --no-cache で再ビルドしてください。


② 症状

  • requirements.txt を更新したのにコンテナ内に反映されない
  • docker build は成功するが import で ModuleNotFoundError が出る
  • ローカルでは動くのに Docker 内だけ失敗する
  • requirements.txt を修正しても挙動が変わらない

③ 原因(原因+詳細)

原因1:Dockerのレイヤーキャッシュが効いている

【詳細】

  • なぜ起きるか
    DockerはDockerfileの各行をレイヤーとしてキャッシュします。
    requirements.txt に変更があっても、COPY の順番や構成によっては
    pip install のレイヤーが再実行されません。
  • 起きやすい条件
    COPY . . を先に書いている/requirements.txt のみを個別COPYしていない
  • 判断ポイント
docker build .
docker history イメージ名


pip install のレイヤーが「CACHED」と表示される場合、再実行されていません。


原因2:Dockerfile内のCOPY順序が不適切

【詳細】

  • なぜ起きるか
    以下のようなDockerfileはキャッシュが効きやすく、
    requirements.txt更新が反映されません。
COPY . .
RUN pip install -r requirements.txt


正しくは以下の順序です。

COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .


これにより、requirements.txt変更時のみpip installが再実行されます。


原因3:ビルドしたイメージと実行コンテナがズレている

【詳細】

  • なぜ起きるか
    docker build を実行しても、古いコンテナを docker run している場合、
    新しいイメージが使われません。
  • 起きやすい条件
    docker-compose 使用時/タグを付け直していない
  • 判断ポイント
docker images
docker ps -a


実行中のコンテナが最新イメージIDと一致しているか確認します。


④ 切り分け手順

  1. docker build --no-cache . で再ビルド
  2. docker images で最新イメージ確認
  3. docker run -it イメージ名 /bin/bash
  4. コンテナ内で pip list 実行

⑤ 解決方法

方法1:キャッシュを無効化してビルド

docker build --no-cache -t app:latest .


方法2:Dockerfileを修正

COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .


方法3:古いコンテナを削除

docker rm -f コンテナ名
docker run -it app:latest


⑥ 再発防止

  • requirements.txt は必ず個別COPYする
  • pip installはDockerfile内で固定する
  • ビルド時にタグを明示する
  • 本番用と開発用Dockerfileを分ける

⑦ それでもダメな場合

importエラーが出る場合は、
コンテナ内で実行しているPythonとpipの紐づけがズレている可能性があります。
以下の記事も参考にしてください。

コメント

タイトルとURLをコピーしました