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
# bad: the archive stays in layer 1 forever, ~200MB even after rm
RUN curl -O https://example.com/toolkit.tar.gz
RUN tar -xzf toolkit.tar.gz && rm toolkit.tar.gz
# good: download, use, and delete inside ONE 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 xoay (rotate) credential chứ không chỉ sửa Dockerfile.
bash
docker history myapp # per-layer size, spot the fat layer
docker save myapp | tar -tv # inspect what each layer actually carriesCá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.