Chuyện đêm muộn: Khi Dockerfile “ngốn” sạch tài nguyên
2 giờ sáng, server production báo lỗi cạn kiệt bộ nhớ. Mình tá hỏa kiểm tra thì thấy image Docker vừa deploy nặng tới 1.8GB, dù source code chỉ vỏn vẹn 45MB. Hóa ra, một thành viên trong team quên thêm .dockerignore, khiến Docker kéo luôn cả folder node_modules nặng nề và đống file rác vào image.
Những sai lầm cơ bản này tiêu tốn cực nhiều thời gian xử lý và băng thông lưu trữ. Giá như có một công cụ tự động “nhắc nhở” ngay lúc gõ lệnh build thì tốt biết mấy. Tin vui là Docker đã ra mắt Build Checks để giải quyết chính xác vấn đề này.
Hãy coi Build Checks như một người quản trò khó tính. Nó soi từng dòng code trong Dockerfile để đảm bảo bạn tuân thủ Best Practices trước khi kịp đẩy đống hỗn độn đó lên server.
Quick Start: Check lỗi Dockerfile trong 5 giây
Nếu bạn muốn biết Dockerfile của mình có đang viết “ẩu” hay không, hãy chạy ngay câu lệnh sau:
docker build --check .
Lưu ý quan trọng: Flag --check không thực sự build ra image nên tốc độ phản hồi cực nhanh. Nó chỉ quét qua cấu trúc và liệt kê các cảnh báo (warnings) nếu bạn vi phạm quy tắc tối ưu.
Giả sử bạn có một Dockerfile “ngây thơ” như sau:
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y git
COPY . /app
CMD python /app/main.py
Docker sẽ lập tức liệt kê các lỗi: khuyên dùng tag cụ thể thay vì latest, và yêu cầu gộp các lệnh RUN để giảm số lượng layer. Rất trực quan và hiệu quả.
Tại sao Build Checks lại thay đổi cuộc chơi?
Trước đây, chúng ta phải cài thêm công cụ bên thứ ba như Hadolint để check lỗi. Hiện tại, Docker đã tích hợp thẳng tính năng này vào Buildx (từ bản 0.13). Việc cấu hình giờ đây đơn giản hơn bao giờ hết.
Cơ chế này hoạt động dựa trên bộ quy tắc (rules) chuẩn hóa từ cộng đồng. Khi bạn ra lệnh, Docker phân tích cú pháp (linting) và so khớp với bộ rules này. Nếu phát hiện rủi ro bảo mật hoặc điểm yếu hiệu suất, hệ thống sẽ hiển thị hướng dẫn sửa lỗi chi tiết.
Thực tế cho thấy, nó không chỉ bắt lỗi cú pháp đơn thuần. Build Checks còn phát hiện cả lỗi logic, chẳng hạn như việc bạn quên xóa cache của apt sau khi cài đặt, khiến image phình to vô ích.
4 lỗi “kinh điển” Build Checks sẽ tóm gọn
Dưới đây là những lỗi mà 90% người mới làm Docker thường mắc phải, khiến image kém tối ưu:
1. Dùng tag “latest” cho base image
Quy tắc: StageNameTerminator. Dùng FROM node:latest giống như đặt một quả bom hẹn giờ. Khi Node.js cập nhật version mới, bản build tiếp theo có thể làm sập toàn bộ ứng dụng do không tương thích. Build Checks sẽ yêu cầu bạn dùng version cố định như node:20-alpine.
2. Lạm dụng quá nhiều lệnh RUN
Mỗi lệnh RUN tạo ra một layer. Nếu viết 5 lệnh riêng biệt, image của bạn sẽ gánh thêm dung lượng thừa. Công cụ sẽ khuyên bạn dùng && và \ để gộp chúng lại thành một layer duy nhất, giúp giảm dung lượng image từ 20-30%.
3. Quên dọn dẹp sau khi cài đặt
Khi chạy apt-get install, Docker lưu lại các file cài đặt tạm thời. Nếu không xóa chúng bằng rm -rf /var/lib/apt/lists/*, image sẽ nặng thêm vài chục MB vô nghĩa. Build Checks cực kỳ nhạy bén trong việc phát hiện sự thiếu sót này.
4. Sai định dạng lệnh CMD
Quy tắc: JSONArgsRecommended. Viết CMD python app.py (shell form) thay vì CMD ["python", "app.py"] (exec form) khiến container không nhận được tín hiệu SIGTERM. Kết quả là container bị “kill” đột ngột thay vì tắt an toàn (graceful shutdown).
Nâng cao: Ép team viết code “sạch” qua CI/CD
Trong dự án thực tế, không phải ai cũng nhớ chạy --check thủ công. Giải pháp triệt để là tích hợp nó vào pipeline CI/CD như GitHub Actions hoặc GitLab CI.
Bạn có thể cấu hình để pipeline tự động thất bại (fail) nếu Dockerfile có cảnh báo nghiêm trọng. Để bắt buộc Docker coi mọi cảnh báo là lỗi và dừng build ngay lập tức, hãy thêm dòng này vào đầu Dockerfile:
# syntax=docker/dockerfile:1
# check=error=true
FROM node:20-alpine
...
Kinh nghiệm thực chiến để tối ưu Image
Sau nhiều lần “trả giá” trên production, mình đúc kết được 3 quy tắc vàng để kết hợp với Build Checks:
- Ưu tiên Multi-stage Build: Tách biệt môi trường build và môi trường chạy. Chỉ giữ lại những gì cần thiết nhất trong image cuối cùng.
- Sắp xếp thứ tự lệnh thông minh: Đặt các lệnh ít thay đổi (cài đặt môi trường) lên trên, code thay đổi thường xuyên xuống dưới để tận dụng tối đa Docker Cache.
- Đừng phớt lờ Warning: Những cảnh báo nhỏ hôm nay có thể là nguyên nhân khiến hệ thống chạy chậm chạp hoặc dính lỗ hổng bảo mật ngày mai.
Áp dụng Docker Build Checks giúp Dockerfile của bạn chuyên nghiệp hơn và mang lại sự an tâm tuyệt đối. Hãy thử chạy docker build --check . ngay hôm nay, có thể bạn sẽ bất ngờ với những gì mình tìm thấy!

