Sửa 1 dòng code, đợi 1 phút build: ‘Nỗi đau’ không của riêng ai
Anh em làm nghề chắc hẳn không lạ gì cái vòng lặp vô tận: Sửa code → Nhấn Save → Chạy lệnh docker-compose up --build → Ngồi đợi vài chục giây để image build xong → Quay lại trình duyệt kiểm tra. Nếu một ngày anh em sửa code 100 lần, tổng thời gian “ngồi chơi xơi nước” đó có thể ngốn mất 1-2 tiếng đồng hồ quý giá.
Giải pháp kinh điển trước đây là dùng Bind Mounts để gắn folder code vào container. Cách này tạm ổn nhưng thường xuyên gây rắc rối về quyền hạn (permissions) hoặc làm node_modules ở máy thật và container “đá” nhau. Đặc biệt, Bind Mount hoàn toàn bó tay nếu anh em cài thêm thư viện mới – lúc đó vẫn phải build lại image từ đầu.
Docker Compose Watch ra đời để dẹp bỏ mớ lỉnh kỉnh đó. Đây không chỉ là mount file đơn thuần, mà là một cơ chế đồng bộ thông minh giúp trải nghiệm code trong Docker mượt mà không thua gì khi chạy trực tiếp trên máy thật.
Docker Compose Watch hoạt động thế nào?
Hiểu đơn giản, Docker Compose Watch là một “trinh thám” âm thầm theo dõi mọi thay đổi trong thư mục dự án. Ngay khi anh em nhấn Ctrl+S, nó sẽ thực hiện một trong ba hành động tùy theo cấu hình:
- Sync: Đẩy file mới vào container ngay lập tức (thường mất dưới 1s, cực hợp cho frontend hot reload).
- Rebuild: Tự động build lại image và restart container khi file cấu hình (
package.json,requirements.txt) thay đổi. - Sync + Restart: Đẩy file vào và khởi động lại dịch vụ (dùng cho backend không có cơ chế tự reload).
Mọi thứ diễn ra tự động bên dưới nền. Anh em cứ tập trung viết code, Docker lo phần còn lại.
Bắt tay vào cấu hình cho dự án Node.js
Để anh em dễ hình dung, mình sẽ lấy ví dụ với một dự án Node.js cơ bản. Giả sử cấu trúc thư mục của anh em như sau:
my-app/
├── src/
│ └── index.js
├── package.json
└── compose.yaml
Bước 1: Tinh chỉnh file compose.yaml
Thay vì chỉ dùng volumes kiểu cũ, chúng ta sẽ thêm khối develop để kích hoạt tính năng theo dõi:
services:
web:
build: .
ports:
- "3000:3000"
develop:
watch:
- path: ./package.json
action: rebuild
- path: ./src
action: sync
target: /app/src
ignore:
- node_modules/
Giải mã các thông số quan trọng:
- path: ./package.json: Khi file này đổi (vừa cài thêm thư viện),
action: rebuildsẽ chạy. Docker tự build lại image để cập nhật thư viện mới mà anh em không cần gõ lệnh. - path: ./src: Mọi thay đổi trong folder src sẽ được
syncvàotarget: /app/srcngay tức thì. - ignore: Loại bỏ các folder nặng như
node_modulesđể máy chạy nhẹ hơn.
Bước 2: Kích hoạt chế độ Watch
Thay vì dùng lệnh up truyền thống, anh em hãy chạy:
docker compose watch
Lúc này, Docker sẽ khởi động container và giữ một tiến trình chạy ngầm. Thử sửa một dòng log trong index.js rồi save lại, anh em sẽ thấy container nhận code mới gần như không có độ trễ.
Vì sao nên bỏ Bind Mount để chuyển sang Watch?
Nhiều anh em sẽ thắc mắc: “Gắn volume thấy cũng nhanh, sao phải bày vẽ thêm?”. Thực tế có 3 lý do cực kỳ thuyết phục:
- Tốc độ vượt trội: Trên macOS hoặc Windows, Bind Mount qua lớp ảo hóa thường khá chậm khi project có hàng nghìn file. Watch dùng cơ chế event-based nên cực kỳ nhẹ máy.
- Kiểm soát chính xác: Watch cho phép chọn đúng file cần đồng bộ. Bạn sẽ không lo chuyện file rác ở máy thật làm hỏng môi trường sạch trong Docker.
- Tự động hóa hoàn toàn: Khả năng tự
rebuildkhi thêm thư viện là thứ mà Bind Mount không bao giờ làm được.
Số liệu thực tế: Tiết kiệm 40% tài nguyên
Nhiều người lo ngại việc chạy tiến trình theo dõi file sẽ làm nặng máy. Thực tế lại ngược lại nếu anh em biết cách ignore đúng folder.
Trên một dự án thực tế với hơn 30 container, mình đã giảm được 40% CPU usage nhờ bỏ các tool sync file của bên thứ ba (như Mutagen hay Docker Sync) và chuyển hẳn sang Compose Watch. Kinh nghiệm của mình là nên tách riêng phần develop ra một file hoặc dùng extends để file compose.yaml chính nhìn gọn gàng hơn.
Nếu dự án lớn, hãy ưu tiên dùng action: sync cho code logic và chỉ dùng rebuild cho các file manifest.
Một vài lưu ý để tránh “ăn hành”
- Kiểm tra phiên bản: Anh em cần Docker Desktop 4.24 hoặc Docker Compose 2.22.0 trở lên. Gõ
docker compose versionđể check ngay nhé. - App hot reload: Docker Watch chỉ đẩy file vào container. Việc ứng dụng có tự load lại hay không vẫn phụ thuộc vào code của anh em (ví dụ dùng
nodemoncho Node.js hoặcuvicorn --reloadcho Python).
Lời kết
Docker Compose Watch thực sự là một bước tiến giúp xóa nhòa khoảng cách giữa local và container. Nó giúp chúng ta tập trung vào việc sáng tạo code thay vì phải làm những việc lặp đi lặp lại nhàm chán. Nếu đang dùng Docker hàng ngày, hãy thử thiết lập Watch ngay, mình tin anh em sẽ không muốn quay lại cách cũ đâu.
Anh em có gặp khó khăn gì khi setup không? Cứ để lại bình luận, mình sẽ giải đáp tận tình!

