Vì image là chồng layer chỉ-thêm (append-only) ghép bằng union filesystem (overlay2).
- Mỗi instruction sinh một layer chứa diff so với layer trước.
- Khi xoá file ở layer sau, union fs chỉ ghi một whiteout marker che file đi — dữ liệu gốc vẫn nằm nguyên trong layer trước và vẫn đi theo image khi push/pull.
dockerfile
# tệ: file nén nằm lại layer 1 mãi mãi, ~200MB dù đã rm
RUN curl -O https://example.com/toolkit.tar.gz
RUN tar -xzf toolkit.tar.gz && rm toolkit.tar.gz
# tốt: tải, dùng rồi xoá trong CÙNG một layer
RUN curl -O https://example.com/toolkit.tar.gz \
&& tar -xzf toolkit.tar.gz \
&& rm toolkit.tar.gzHệ quả về bảo mật: file .env, private key, .git lỡ COPY vào rồi rm thì vẫn trích xuất được từ layer cũ — coi như đã lộ, phải rotate credential chứ không chỉ sửa Dockerfile.
bash
docker history myapp # xem dung lượng từng layer, tìm layer phình to
docker save myapp | tar -tv # soi xem mỗi layer thật sự chứa gìCách xử lý theo thứ tự ưu tiên: gộp các thao tác tạm vào cùng một RUN (kèm dọn apt cache: rm -rf /var/lib/apt/lists/*); dùng cache mount cho cache package manager; và với artifact build thì dùng multi-stage — chỉ COPY --from đúng thứ cần, mọi rác ở stage trước không vào image cuối.