DevOps 22/09/2026 6 phút

Dockerfile cache: vì sao đổi một dòng code khiến build cài lại toàn bộ dependencies

Mỗi lệnh Dockerfile là một layer được cache; đổi một layer làm hỏng cache của MỌI layer sau nó. Đặt COPY . . trước khi cài dependencies là lỗi kinh điển: sửa một dòng code buộc build cài lại toàn bộ deps. Bài này đo thật hai Dockerfile cùng app: sau khi sửa code, bản sai mất 3.8s (cài lại deps), bản đúng chỉ 0.6s.

DevOps 22/09/2026 5 phút

Build context: vì sao docker build gửi cả thư mục lên daemon, và .dockerignore cứu bạn

Dấu chấm trong docker build . là build context — docker nén CẢ thư mục và gửi lên daemon trước khi build, kể cả file không dùng tới. Bài này đo thật: một thư mục 70MB (node_modules + .git) gửi nguyên context 70.01MB dù Dockerfile chỉ COPY app.py; thêm .dockerignore, context còn 4.096kB — và quan trọng hơn, nó chặn .env/.git lọt vào image.

DevOps 22/09/2026 5 phút

Multi-stage build: vì sao image Go của bạn nặng 400MB thay vì 3MB

Để BUILD một chương trình cần trình biên dịch và cả toolchain hàng trăm MB; để CHẠY chỉ cần binary vài MB. Nếu build và chạy cùng một image, image cuối mang theo cả toolchain. Bài này build một chương trình Go thật hai cách: một-stage cho image 407MB, multi-stage (copy binary sang scratch) cho 3.4MB — cùng chạy y hệt, giảm ~120 lần.