Vì bind mount .:/app che toàn bộ thư mục /app trong image bằng thư mục host — kể cả node_modules đã cài lúc build. Host không có node_modules (hoặc có bản build cho OS khác) → app không tìm thấy module.
Cách xử lý: mount đè một anonymous/named volume lên đúng thư mục đó để giữ nội dung từ image.
yaml
services:
api:
build: .
volumes:
- .:/app # source from host, for hot reload
- /app/node_modules # keeps the image's node_modules, not the host'sKhác biệt hai loại mount:
| Bind mount | Named volume | |
|---|---|---|
| Nguồn | Đường dẫn cụ thể trên host | Docker quản lý trong /var/lib/docker/volumes |
| Mục đích chính | Dev: sửa code thấy ngay | Prod: dữ liệu bền (DB, uploads) |
| Phụ thuộc host | Có — path phải tồn tại, khác nhau giữa các máy | Không — portable |
| Hiệu năng trên macOS/Windows | Chậm hơn do lớp chia sẻ file | Nhanh, nằm trong VM |
| Backup | Tự lo | docker volume + docker run --volumes-from |
Quy tắc: bind mount cho dev, named volume cho dữ liệu production.