0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

npm installの結果がDocker環境に反映されない

Posted at

事象

image.png

Docker環境で、Reactを使ったWebアプリケーションを作成していた際、npm install react-router-domが成功したはずなのに[plugin:vite:import-analysis] Failed to resolve import "react-router-dom" from "src/App.tsx". Does the file exist?が出ている。

原因

ローカル環境で行ったnpm install react-router-domが、Docker環境に反映されていなかったことが原因。
Viteの古いキャッシュが使われているのではと思い、Docker環境内で、npm run dev -- -forceを実行しようとしたところ、以下のようにErrorが出ていた。

image.png

ローカルのファイルをDocker環境にマウントしているが、node_modulesは、ローカルと同期しないように、名前付きボリュームに格納していた。このため、ローカルホストでnpm install react-router-domを実行しても、Docker環境内のnode_modulesにはそれが反映されず、上記エラーが発生した。

docker-compose.yaml
services:
    frontend:
        build: ./frontend
        container_name: react-frontend
        volumes:
          - ./frontend:/react-frontend
          - node_modules:/react-frontend/node_modules
        ports:
          - "5173:5173"

volumes:
  node_modules:

解決策

Docker環境内のnode_modulesに、ローカルでインストールしたライブラリの情報を反映させれば解決する。具体的な方法は以下の2つ。

ただしこれらの解決策は、あくまで上記原因に対して有効なのであって、他の原因の場合は別の対応が必要。

その1. Docker環境内で、ローカルと同じライブラリをnpm installする

  1. docker exec -it ${CONTAINER_NAME}で、Docker環境内のBashに入る
  2. ローカルと同様のライブラリをインストールする
  3. ローカルのnode_modulespackage-lock.jsonを削除し、ローカル環境npm installを実行する

3ステップ目について、node_modulespackage-lock.jsonを削除することで、依存関係を整理しなおしている。

その2. 名前付きボリュームを削除して、再度Buildする

Docker環境内のnode_modulesを削除してBuildすると、package.jsonをもとに再度node_modulesが生成される。ローカル環境のpackage.jsonには既にライブラリへインストールした情報が反映されているため、再生成されたnode_modulesにも、それが反映される。

# Volumeを消す前にコンテナを停止
docker-compose down
# 名前付きボリュームを削除
docker volume rm node_modules
# 再度Buildを実行
docker-compose build

名前付きVolumeを同時にすべて削除してしまっても問題ない場合は、以下の手順でも同様に動作する。

# コンテナ停止時に、名前付きボリュームをすべて削除
docker-compose down -v
# 再度Buildを実行
docker-compose build

最後に

今回は、Docker-composeの名前付きボリュームに、ローカルでの操作が、うまく反映されないことが原因でした。
対応策を2つ提示しましたが、ライブラリをインストールするたびに同様の手順が必要なことを考えると、少し手間になる作業であるため、より良い方法を知っている方がいれば教えていただきたいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?