Cara Optimasi Ukuran Docker Image dengan Multi-Stage Build
Hai DomaiNesians! Ukuran Docker image yang terlalu besar sering menjadi kendala karena dapat memperlambat build, deployment, dan meningkatkan penggunaan storage secara signifikan. Salah satu cara paling efektif untuk mengatasinya adalah dengan multi-stage build, di mana proses build dan runtime dipisahkan menjadi beberapa tahap. Hanya artefak yang benar-benar dibutuhkan yang akan masuk ke image akhir, sehingga image menjadi lebih ringan dan cepat. Teknik ini tidak hanya mengoptimalkan resource server, tetapi juga membuat workflow containerisasi lebih rapi dan mudah di-maintain, terutama untuk proyek yang berskala besar.
Apa Itu Multi-Stage Build dan Manfaatnya?
Multi-stage build adalah teknik dalam Docker yang membuat proses build dan runtime dipisahkan menjadi beberapa tahap dalam satu Dockerfile. Dengan pendekatan ini, hanya artefak yang benar-benar dibutuhkan untuk menjalankan aplikasi yang akan dimasukkan ke image akhir, sedangkan file sementara, tool build, atau dependency yang hanya diperlukan saat build akan dibuang. Hal ini membuat image akhir menjadi lebih bersih dan ringan.
Beberapa manfaat utama dari multi-stage build antara lain:
- Ukuran image lebih kecil – mengurangi layer yang tidak diperlukan sehingga image lebih ringan, cepat di-pull, dan hemat bandwidth.
- Efisiensi resource – menghemat storage dan meminimalkan penggunaan memory saat build atau deployment.
- Keamanan lebih baik – dependency build yang sensitif atau tool developer tidak ikut masuk ke image produksi, mengurangi potensi risiko keamanan.
- Workflow lebih rapi dan terstruktur – memisahkan environment build dan runtime membuat Dockerfile lebih mudah dibaca, dipelihara, dan scalable.
- Mendukung deployment di berbagai environment – image yang ringan dan bersih lebih fleksibel untuk dijalankan di server, VPS, atau cloud tanpa modifikasi tambahan.
Selain itu, multi-stage build juga membantu mempercepat proses CI/CD, karena tahap build dan tahap runtime dapat dijalankan secara terpisah, mempermudah debugging, serta meminimalkan error saat deploy. Teknik ini menjadikan Dockerfile lebih modular dan memudahkan pengelolaan project yang kompleks, terutama untuk tim pengembang yang bekerja secara kolaboratif.
Persiapan Docker Environment
Sebelum DomaiNesians membuat Dockerfile dengan multi-stage build, pastikan lingkungan Docker di server atau mesin lokal sudah siap. Persiapan yang matang akan meminimalkan error dan memperlancar proses build.
1. Instalasi Docker
Pastikan docker sudah diinstall dan aktif di VPS
2. Tambahkan User ke Group Docker (Opsional)
Agar bisa menjalankan Docker tanpa sudo:
|
1 2 |
sudo usermod -aG docker $USER newgrp docker |
3. Persiapkan Direktori Project
Buat direktori project untuk menyimpan Dockerfile dan source code aplikasi:
|
1 2 |
mkdir -p ~/docker-project cd ~/docker-project |
Membuat Dockerfile Multi-Stage
Setelah lingkungan Docker siap, langkah berikutnya adalah membuat Dockerfile multi-stage untuk aplikasi. Teknik multi-stage memungkinkan memisahkan tahap build dan runtime, sehingga image akhir menjadi lebih ringan dan efisien.
1. Struktur Dasar Dockerfile Multi-Stage
Contoh Dockerfile untuk aplikasi Node.js:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Stage 1: Build FROM node:18 AS builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build # Stage 2: Production FROM node:18-alpine WORKDIR /app COPY --from=builder /app/dist ./dist COPY package*.json ./ RUN npm install --production CMD ["node", "dist/index.js"] |
2. Penjelasan Tahap Build
- Stage 1 (builder):
- Menggunakan image Node.js lengkap untuk build.
- Menginstall semua dependency dan membangun aplikasi.
- Semua file sementara dan dev-dependency tetap berada di stage ini.
- Stage 2 (Production):
- Menggunakan image alpine yang lebih ringan.
- Hanya menyalin hasil build dari stage builder.
- Menginstall dependency yang dibutuhkan runtime saja.
Mengurangi Ukuran Docker Image Secara Efektif
Setelah Dockerfile multi-stage siap, ada beberapa langkah tambahan untuk memperkecil ukuran image:
- Gunakan Base Image Ringan
Pilih image seperti alpine atau slim untuk stage production. Contoh:
FROM node:18-alpine - Hapus File yang Tidak Diperlukan
Pastikan hanya menyalin file yang dibutuhkan ke stage produksi:
COPY –from=builder /app/dist ./dist - Gabungkan Perintah RUN
Menggabungkan beberapa perintah RUN menjadi satu akan mengurangi jumlah layer, sehingga image lebih kecil:
1RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/* - Gunakan .dockerignore
Hindari menyalin file yang tidak perlu, seperti node_modules atau file dokumentasi, dengan menambahkannya ke .dockerignore. - Optimalkan Dependency
Install hanya dependency yang dibutuhkan untuk runtime dengan –production di Node.js, atau opsi serupa untuk bahasa lain. - Jalankan Container untuk Testing
Bangun image dari Dockerfile:
|
1 |
docker build -t nama-aplikasi:latest . |
7. Jalankan dan Verifikasi Container
Jalankan container untuk memastikan aplikasi berjalan:
|
1 2 |
docker run -d -p 3000:3000 nama-aplikasi:latest docker logs <container_id> |
Cek fungsionalitas aplikasi melalui browser atau curl. Setelah selesai, hentikan dan hapus container testing:
|
1 2 |
docker stop <container_id> docker rm <container_id> |
Troubleshooting Multi-Stage BuildÂ
Saat bekerja dengan Docker multi-stage build di VPS, beberapa masalah sering muncul. Berikut beberapa kasus umum beserta cara menanganinya:
1. Build Gagal karena Dependency Hilang
Kadang proses build berhenti karena dependency yang dibutuhkan tidak terinstall. Pastikan semua package dan library yang dibutuhkan tercantum di stage build, dan cek syntax perintah RUN atau COPY di Dockerfile.
2. Container Tidak Bisa Start
Jika container gagal berjalan, penyebabnya bisa dari CMD atau ENTRYPOINT yang kurang tepat, atau port yang bentrok dengan service lain di VPS. Solusinya jalankan container secara interaktif untuk menelusuri error secara langsung.
3. File atau Artefak Hilang di Stage Production
Multi-stage build memisahkan build dan runtime, jadi jangan sampai file penting tidak disalin ke stage akhir. Pastikan perintah COPY –from=builder menyalin file yang benar, dan periksa .dockerignore supaya tidak menahan file yang dibutuhkan.
4. Image Terlalu Besar atau Boros Resource VPS
Image besar dapat membebani VPS, memperlambat deploy, dan memakan storage. Gunakan base image ringan seperti alpine, hapus file sementara, dan install hanya dependency yang diperlukan untuk runtime.
5. Port atau Resource VPS Bentrok
Container membutuhkan port dan resource tertentu. Periksa penggunaan port dan kapasitas VPS agar container berjalan lancar.
Optimalkan Workflow Docker dengan Image Ringan dan Efisien
Menggunakan multi-stage build memungkinkan Docker image menjadi lebih ringan, efisien, dan mudah dikelola. Dengan langkah optimasi, penghapusan file yang tidak perlu, serta verifikasi menyeluruh, workflow containerisasi berjalan lebih stabil dan profesional, sehingga meminimalkan masalah saat deployment. Teknik ini sangat cocok untuk memastikan aplikasi berjalan lancar di berbagai environment, terutama saat dijalankan di VPS berkinerja tinggi yang mendukung proses build dan deployment cepat.
Gunakan Cloud VPS yang andal untuk mendukung deployment aplikasi dengan lebih cepat, ringan, dan efisien. Dengan resource yang hemat, performa stabil, dan skalabilitas tinggi, tim pengembang dapat fokus membangun aplikasi tanpa khawatir soal performa container maupun ukuran image. Saatnya beralih ke Cloud VPS yang siap mendukung setiap proyek hingga skala besar.

