Panduan Lengkap docker builder prune: Hemat Ruang Disk Tanpa Mengganggu Production

docker builder prune adalah perintah untuk menghapus cache build (lapisan/layers sementara) yang dihasilkan saat proses build image. Ini tidak menghapus container atau image yang sedang dipakai, tetapi jika digunakan tanpa strategi, dapat membuat build berikutnya menjadi lebih lambat karena cache perlu dibuat ulang.

Masalah

  • Ruang disk cepat habis pada server build, runner CI/CD, atau laptop developer.
  • Build baru gagal dengan error seperti no space left on device.
  • Direktori Docker (mis. /var/lib/docker) membengkak akibat cache lama yang tidak pernah dibersihkan.

Penyebab

  1. Sering melakukan build image dengan perubahan kecil → menghasilkan banyak layer cache.
  2. BuildKit menyimpan cache untuk mempercepat build berikutnya, namun cache lama tidak otomatis dibuang.
  3. Runner CI/CD membangun banyak project/multi-branch tanpa kebijakan retensi cache.

Solusi

Gunakan docker builder prune dengan filter dan kebijakan yang jelas.

Opsi Penting

  • -f / --force: lewati konfirmasi interaktif.
  • -a / --all: hapus semua cache, bukan hanya yang dangling.
  • --filter "until=<durasi>": hapus cache yang lebih tua dari durasi tertentu, contoh until=24h atau until=168h (7 hari).
  • --keep-storage <bytes>: pertahankan cache baru sampai batas minimum ruang yang ingin disisakan (contoh: --keep-storage 10GB).

Contoh Perintah Dasar

# Lihat pemakaian ruang Docker (cache, images, containers)
docker system df -v

# Hapus cache dangling saja (aman, default interaktif)
docker builder prune

# Hapus cache lebih tua dari 24 jam, tanpa prompt
docker builder prune --filter "until=24h" -f

# Hapus SEMUA cache build (agresif)
docker builder prune -a -f

# Hapus cache hingga menyisakan 10GB ruang cache yang paling baru
docker builder prune --keep-storage=10GB -f

Tips Praktik Terbaik

  • Mulai dengan --filter "until=24h" atau until=168h (mingguan) untuk keseimbangan antara ruang disk dan kecepatan build.
  • Hindari -a pada jam sibuk; gunakan saat low-traffic agar build pertama setelah prune tidak mengganggu tim.
  • Monitor ruang dengan docker system df -v sebelum dan sesudah pruning.
  • Di runner CI/CD ephemeral, gunakan kebijakan agresif (boleh -a) karena runner akan dibuang setelah job.

Contoh & Skenario

1) Pembersihan Terjadwal (Linux, cron)

# Jalankan prune setiap Minggu pukul 02:30, hapus cache lebih tua dari 7 hari
# Edit crontab: crontab -e
30 2 * * 0 /usr/bin/docker builder prune --filter "until=168h" -f >/var/log/docker-prune.log 2>&1

2) Integrasi di GitLab CI

# .gitlab-ci.yml (contoh job opsional untuk hygiene disk)
prune_cache:
  stage: maintenance
  image: docker:stable
  services:
    - docker:dind
  rules:
    - if: '$CI_COMMIT_BRANCH == "main"'
      when: manual
  script:
    - docker system df -v
    - docker builder prune --filter "until=168h" -f
    - docker system df -v

3) GitHub Actions (Self-Hosted Runner)

name: Docker Cache Hygiene
on:
  workflow_dispatch:
  schedule:
    - cron: '30 2 * * 0'
jobs:
  prune:
    runs-on: self-hosted
    steps:
      - name: Check disk usage
        run: docker system df -v
      - name: Prune old build cache
        run: docker builder prune --filter "until=168h" -f

4) Windows (Task Scheduler)

# Jalankan sebagai tugas terjadwal mingguan:
powershell -Command "docker builder prune --filter 'until=168h' -f"

5) Sebelum vs Sesudah

# Sebelum
$ docker system df -v
BUILD CACHE:
TYPE      SIZE      CREATED BY                           LAST USED
regular   8.5GB     dockerfile: RUN npm ci               3 weeks ago
regular   3.2GB     dockerfile: RUN apt-get install ...  10 days ago
...

# Prune cache lebih tua dari 7 hari
$ docker builder prune --filter "until=168h" -f
Deleted build cache objects: 12
Total reclaimed space: 8.5GB

# Sesudah
$ docker system df -v
BUILD CACHE:
TYPE      SIZE      CREATED BY                           LAST USED
regular   3.2GB     dockerfile: RUN apt-get install ...  2 days ago

Risiko & Mitigasi

  • Build pertama setelah prune bisa lebih lama karena cache harus dibuat ulang.
    Mitigasi: jadwalkan di luar jam sibuk, gunakan filter waktu daripada -a.
  • Runner berbagi cache lintas project bisa kehilangan cache yang masih berguna.
    Mitigasi: gunakan --keep-storage agar tetap menyisakan ruang cache terbaru.

Checklist Praktik Terbaik

  • Otomasi pruning mingguan dengan until=168h di lingkungan build.
  • Gunakan -a hanya pada runner sementara/ephemeral atau saat butuh ruang besar cepat.
  • Monitor disk: docker system df -v + alerting (Prometheus/Node Exporter) bila memungkinkan.
  • Optimalkan Dockerfile untuk cache yang efisien (urutkan perintah dari yang paling jarang berubah, pisahkan apt-get update/install dengan tepat, gunakan .dockerignore).
Apakah docker builder prune menghapus image atau container?
Tidak. Ia hanya membersihkan build cache. Untuk image/container gunakan perintah lain seperti docker image prune atau docker system prune (lebih agresif).

Apa beda dengan docker system prune?
system prune menyapu luas (network dangled, images dangling, stopped containers, dll). builder prune fokus pada cache build saja — lebih aman untuk pipeline build.

Kapan sebaiknya pakai -a?
Ketika benar-benar kekurangan ruang atau di runner ephemeral. Untuk server build yang persist, lebih baik pakai filter waktu atau --keep-storage.

Kesimpulan
docker builder prune adalah cara cepat dan aman untuk mengendalikan pertumbuhan cache build Docker. Dengan memadukan --filter "until=...", --keep-storage, dan penjadwalan rutin, Anda bisa menjaga ruang disk tetap sehat tanpa mengorbankan produktivitas tim.