bind mount 掛原始碼會蓋掉 image 裡的 node_modules

開發熱重載時 -v $(pwd):/app 會把主機目錄整個蓋在容器的 /app 上,連 image 裡 build 時裝好的 node_modules 也一起被蓋掉——而你主機上可能根本沒有,或裝的是給不同 OS/架構用的版本。

解法:多掛一個匿名 volume 開洞

docker run -d --name dev -p 3000:3000 \
  -v $(pwd):/app \
  -v /app/node_modules \   # ← 在這個位置開一個洞,讓 image 原本的內容露出來
  my-app:dev

Compose 版本同理:

volumes:
  - .:/app
  - /app/node_modules

Mac 上的額外考量

bind mount 在 Mac 要跨 VM 邊界(見 VM 與容器的差別在有沒有自己的 kernel),I/O 很慢。大量小檔案(如 node_modules)盡量用 named volume 而不是 bind mount。

相關:容器可拋棄,資料要靠 Volume 留在容器外