Vì mỗi job CI chạy trên runner sạch — không có local layer cache của lần build trước. Cache phải được xuất ra kho ngoài và nạp lại.
Registry cache (dùng được với mọi CI):
docker buildx build \
--cache-from=type=registry,ref=myrepo/app:buildcache \
--cache-to=type=registry,ref=myrepo/app:buildcache,mode=max \
-t myrepo/app:$SHA --push .mode=max xuất cache của mọi stage (kể cả stage build trong multi-stage), mode=min chỉ xuất layer của image cuối — multi-stage gần như luôn cần max. Trên GitHub Actions còn có type=gha.
Cache mount giữ thư mục cache của package manager giữa các lần build mà không đưa vào layer:
RUN --mount=type=cache,target=/root/.npm npm ci
RUN --mount=type=cache,target=/go/pkg/mod go build ./...Các nguyên nhân miss cache khác hay bị bỏ sót:
- COPY . . quá sớm + thiếu .dockerignore → file rác (log, .git, output test) đổi checksum mỗi lần.
- ARG đặt trước các layer nặng — giá trị ARG đổi (vd BUILD_DATE, GIT_SHA) làm hỏng cache từ điểm đó trở xuống; đẩy chúng xuống sát cuối Dockerfile.
- RUN apt-get update riêng một dòng — layer cũ được tái dùng kèm index gói lỗi thời; luôn gộp update && install trong cùng một RUN.