Họ đang đo gì
Bạn có hiểu mô hình tầng của Docker không, hay chỉ copy Dockerfile từ đâu đó.
Trả lời ngắn~30 giây
Docker cache theo tầng: nếu nội dung một lệnh và các tầng trước nó không đổi thì tầng đó được dùng lại. Nên nếu bạn COPY . . trước rồi mới npm ci, mọi thay đổi code — kể cả sửa một dòng README — làm cache của npm ci hỏng và bạn cài lại toàn bộ dependency. Đảo lại: copy package*.json, chạy npm ci, rồi mới copy code — dependency chỉ cài lại khi package.json đổi thật.
Giải thích sâu
Multi-stage build là bước tiếp theo và thường giảm kích thước ảnh nhiều nhất: stage đầu có toàn bộ công cụ build, stage cuối chỉ copy kết quả sang một ảnh runtime tối giản. Ảnh Node điển hình đi từ khoảng 1,2GB xuống dưới 200MB — vừa tải nhanh hơn khi scale, vừa ít bề mặt tấn công hơn vì không còn trình biên dịch trong ảnh chạy production.
Một điểm ít người để ý: xoá file ở tầng sau KHÔNG làm ảnh nhỏ đi. Nếu bạn COPY một file bí mật rồi RUN rm nó ở lệnh tiếp theo, file vẫn nằm trong tầng trước và ai cũng trích xuất được từ ảnh. Đây là một trong những cách rò rỉ khoá phổ biến nhất — với thứ nhạy cảm phải dùng build secret hoặc multi-stage, không phải rm.
# Cache hỏng mỗi lần sửa bất kỳ file nào
COPY . .
RUN npm ci
# Cache chỉ hỏng khi dependency đổi
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run buildCâu hỏi tiếp theo họ sẽ hỏi
?COPY và ADD khác gì?
ADD làm thêm hai việc: tải URL và tự giải nén tar. Cả hai đều ngầm và khó đoán, nên khuyến nghị chính thức là dùng COPY trừ khi bạn thật sự cần giải nén.
Trả lời thế này là mất điểm
- Chạy container bằng user root mà không nói tới.
USER nodelà một dòng và nó thu hẹp hậu quả của mọi lỗ hổng bên trong. - Dùng tag
latesttrong ảnh nền. Build của bạn không còn tái lập được, và một hôm nào đó nó hỏng mà không ai đổi gì.