Dipublikasikan 18 Juli 2026
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.
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 versionJika BuildKit belum aktif, aktifkan melalui environment variable:
export DOCKER_BUILDKIT=1Kesalahan 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.
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.
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 buildDengan struktur ini, npm ci tidak perlu dijalankan ulang setiap kali source code berubah. Hanya layer COPY . . ke bawah yang akan di-rebuild.
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 --forceSetelah image di-build, selalu lakukan scanning vulnerability menggunakan docker scout atau Trivy:
docker scout cves myapp:latest
trivy image myapp:latestVerifikasi 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.
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.
Dapatkan feedback, users, dan eksposur dari komunitas kreator, developer, dan entrepreneur digital Indonesia.
Submit Produk → Pelajari Dulu