Optimasi Dockerfile: Best Practice untuk Image yang Lebih Ringan dan Cepat

Docker memungkinkan kita membangun container yang portabel dan ringan. Namun, Docker image yang tidak dioptimasi bisa memakan banyak storage, memperlambat build, bahkan memicu masalah deployment. Artikel ini akan membahas best practice dalam menulis Dockerfile agar menghasilkan image yang lebih ringan, cepat, dan aman.


Mengapa Optimasi Dockerfile Penting?

  • Ukuran image lebih kecil: Menghemat bandwidth dan storage.
  • Waktu build lebih cepat: Mengurangi waktu developer dan CI/CD.
  • Keamanan lebih baik: Mengurangi attack surface dengan menghapus file/file sementara yang tidak dibutuhkan.

1. Gunakan Base Image yang Ringan

Hindari ubuntu atau debian jika tidak benar-benar butuh. Pilih:

  • alpine: sangat kecil (sekitar 5MB) dan cocok untuk aplikasi Go, Node.js, dll.
  • distroless: image minimal yang hanya membawa runtime, cocok untuk production.

Contoh:

FROM alpine:latest

2. Multi-Stage Build

Gunakan multi-stage build untuk memisahkan tahap build dan runtime:

# Tahap Build
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# Tahap Runtime
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
ENTRYPOINT ["./myapp"]

Ini akan menghasilkan image final yang hanya membawa binary, bukan toolchain build.


3. Gabungkan RUN Statement

Setiap RUN akan membuat layer baru. Gabungkan beberapa perintah dalam satu RUN dengan &&:

RUN apt-get update && apt-get install -y \
curl \
git \
&& apt-get clean && rm -rf /var/lib/apt/lists/*

Ini membuat image lebih kecil karena file cache dihapus sebelum layer selesai.


4. Minimalkan COPY/ADD

  • Gunakan .dockerignore agar file yang tidak perlu (misalnya node_modules, tmp, .git) tidak masuk ke image.
  • Tambahkan file secara spesifik, bukan wildcards yang besar.

Contoh .dockerignore:

.git
node_modules
*.log

5. Gunakan Layer Cache dengan Bijak

Docker menggunakan caching per layer. Urutan COPY dan RUN berpengaruh:

  • Letakkan perintah yang jarang berubah di bagian awal Dockerfile (misalnya apt install).
  • Letakkan COPY . . di bagian akhir agar cache tidak invalidated setiap ada perubahan file kecil.

6. Hapus File yang Tidak Diperlukan

Setelah instalasi, bersihkan file build:

RUN make build \
&& rm -rf /tmp/build

7. Tetap Gunakan USER Non-Root

Untuk keamanan, tambahkan user non-root:

RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

8. Gunakan Tag Versi yang Spesifik

Daripada:

FROM node:latest

Gunakan:

FROM node:20.2.0

Ini mencegah perubahan image yang tak terduga.


Kesimpulan

Mengoptimasi Dockerfile adalah langkah penting agar image kamu lebih ringan, cepat, dan aman. Gunakan base image ringan, multi-stage build, cache layer dengan bijak, dan jangan lupa praktik keamanan seperti user non-root.

Dengan mengikuti best practice ini, workflow container-mu akan lebih efisien dan lebih mudah di-maintain.