Optimasi Docker Image untuk Production: Multi-Stage Build dan Best Practices
AW
Axel W

Dipublikasikan 18 Juli 2026

Optimasi Docker Image untuk Production: Multi-Stage Build dan Best Practices

Docker telah menjadi standar de facto untuk packaging dan deployment aplikasi modern. Namun, banyak developer masih membangun image yang berukuran ratusan megabyte bahkan gigabyte, padahal ukuran tersebut bisa dipangkas drastis dengan teknik multi-stage build. Artikel ini akan membahas praktik terbaik untuk mengoptimasi Docker image agar siap digunakan di production environment.

Image Docker yang besar bukan hanya masalah storage. Build time yang lambat, bandwidth transfer yang boros, dan surface area untuk serangan security menjadi alasan utama kenapa optimasi image tidak bisa ditolerir. Berikut adalah panduan lengkap untuk membuat image Docker yang lean dan production-ready.

Persiapan Environment

Sebelum mulai, pastikan Docker Engine sudah terinstall dengan versi minimal 20.10 karena fitur BuildKit menjadi default di versi tersebut. Verifikasi dengan menjalankan perintah:

docker --version
docker buildx version

Jika BuildKit belum aktif, aktifkan melalui environment variable:

export DOCKER_BUILDKIT=1

Langkah 1: Gunakan Base Image yang Minimal

Kesalahan paling umum adalah menggunakan ubuntu:latest atau debian:latest sebagai base image. Untuk aplikasi yang di-compile seperti Go atau Rust, pilih scratch atau distroless. Untuk Node.js atau Python, gunakan varian Alpine atau Slim.

Perbandingan ukuran typical:

  • node:20 : sekitar 1.1 GB

  • node:20-alpine : sekitar 180 MB

  • node:20-slim : sekitar 250 MB

Pilihlah base image yang paling sesuai dengan kebutuhan runtime aplikasi. Dokumentasi lengkap tentang image official Docker tersedia di Docker Hub.

Langkah 2: Implementasikan Multi-Stage Build

Multi-stage build memungkinkan kita menggunakan satu Dockerfile dengan beberapa tahapan build, di mana tahap akhir hanya menyalin artifact yang diperlukan dari tahap sebelumnya. Berikut contoh untuk aplikasi Go:

# Stage 1: Build
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o main .

# Stage 2: Final image
FROM scratch
WORKDIR /app
COPY --from=builder /app/main .
EXPOSE 8080
ENTRYPOINT ["./main"]

Dengan pola ini, image final hanya berisi binary executable tanpa toolchain Go, package manager, atau shell. Ukuran image bisa turun dari 350 MB menjadi kurang dari 20 MB.

Langkah 3: Optimasi Layer Caching

Docker build bekerja dengan layer caching. Urutan instruksi dalam Dockerfile sangat mempengaruhi cache hit rate. Letakkan instruksi yang paling jarang berubah di atas, dan instruksi yang sering berubah di bawah.

FROM node:20-alpine
WORKDIR /app

# Layer yang jarang berubah
COPY package*.json ./
RUN npm ci --only=production

# Layer yang sering berubah
COPY . .
RUN npm run build

Dengan struktur ini, npm ci tidak perlu dijalankan ulang setiap kali source code berubah. Hanya layer COPY . . ke bawah yang akan di-rebuild.

Langkah 4: Bersihkan Cache dan File Sementara

Setiap instruksi RUN menciptakan satu layer. Jika Anda menghapus file di instruksi terpisah, file tersebut tetap ada di layer sebelumnya dan masih memakan ukuran image. Solusinya adalah gabungkan operasi dalam satu RUN:

RUN apt-get update && apt-get install -y \n    build-essential \n    && rm -rf /var/lib/apt/lists/*

Untuk package manager seperti npm atau pip, gunakan flag clean:

RUN npm ci --only=production && npm cache clean --force

Langkah 5: Scan Security dan Final Verification

Setelah image di-build, selalu lakukan scanning vulnerability menggunakan docker scout atau Trivy:

docker scout cves myapp:latest
trivy image myapp:latest

Verifikasi ukuran final dan bandingkan dengan versi sebelumnya:

docker images myapp:latest --format "{{.Size}}"

Terapkan juga .dockerignore untuk mengecualikan file yang tidak perlu masuk ke build context seperti node_modules, .git, dan file environment.

Kesimpulan

Optimasi Docker image adalah investasi jangka panjang yang mengurangi biaya infrastructure dan meningkatkan keamanan. Kombinasi multi-stage build, base image minimal, layer caching yang efisien, dan security scanning akan menghasilkan image yang lean, cepat di-deploy, dan lebih aman. Untuk referensi lebih lanjut, kunjungi dokumentasi resmi Docker multi-stage build.