Mem Build Multi-Stage Docker Image untuk Aplikasi Node.js: Optimasi Ukuran Image

Lhuqita Fazry
Docker & DevOps Docker Node.js DevOps
Mem Build Multi-Stage Docker Image untuk Aplikasi Node.js: Optimasi Ukuran Image

Ukuran Docker image adalah concern kritis dalam production deployment. Image yang besar memperlambat build process, menghabiskan storage, dan meningkatkan waktu deployment. Multi-stage build adalah teknik yang memungkinkan kita memisahkan build environment dari production environment secara efisien.

Masalah dengan Single-Stage Build

Dockerfile tradisional sering menggabungkan semua dependencies dalam satu layer. node_modules development, build tools, dan source code ikut terbawa ke production image. Hasilnya: image dengan ukuran ratusan MB bahkan GB.

dockerdockerfile
# Dockerfile tradisional (tidak efisien)
FROM node:18

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .
RUN npm run build

EXPOSE 3000
CMD ["node", "dist/main.js"]

Image ini mengandung development dependencies, TypeScript compiler, dan source code yang tidak diperlukan di production. Waste resources yang signifikan.

Konsep Multi-Stage Build

Multi-stage build memungkinkan kita menggunakan multiple FROM statements dalam satu Dockerfile. Setiap FROM memulai stage baru dengan clean base image. Kita dapat meng-copy artifact dari stage sebelumnya tanpa membawa baggage-nya.

Pola yang umum digunakan: stage pertama untuk build (compile, install dev dependencies), stage kedua untuk production (runtime only).

dockerdockerfile
# Stage 1: Build
FROM node:18-alpine AS builder

WORKDIR /app

COPY package*.json ./
RUN npm ci

COPY . .
RUN npm run build

# Stage 2: Production
FROM node:18-alpine AS production

WORKDIR /app

# Copy hanya production dependencies
COPY package*.json ./
RUN npm ci --only=production

# Copy built files dari stage builder
COPY --from=builder /app/dist ./dist

EXPOSE 3000
USER node

CMD ["node", "dist/main.js"]
MERN Stack Development
Web App • Beginner

MERN Stack Development

Launch your journey into full-stack web development with this comprehensive, pro...

Daftar

Optimasi Lebih Lanjut

Selain multi-stage, ada beberapa teknik optimasi tambahan untuk image Node.js yang lebih kecil.

Gunakan Alpine Base Image: Alpine Linux adalah distribusi minimalis dengan ukuran sekitar 5MB. Base image node:18-alpine jauh lebih kecil dibanding node:18 standar.

Cache Dependencies: Urutan layer dalam Dockerfile penting. Copy package.json sebelum source code untuk memanfaatkan Docker layer caching.

dockerdockerfile
# Optimasi layer caching
COPY package*.json ./
RUN npm ci --only=production

# Source code berubah sering, taruh di layer akhir
COPY . .

Remove Unnecessary Files: Bersihkan cache npm dan file yang tidak diperlukan.

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

Membandingkan Ukuran Image

Untuk melihat perbedaan, build kedua versi Dockerfile:

bashbash
# Build single-stage
docker build -f Dockerfile.single -t app:single .

# Build multi-stage
docker build -f Dockerfile.multi -t app:multi .

# Compare ukuran
docker images app:single app:multi

Dalam praktiknya, multi-stage dengan Alpine dapat mengurangi ukuran image dari 800MB+ menjadi di bawah 100MB. Pengurangan 80-90% ukuran tidak jarang terjadi.

Production Best Practices

Selain ukuran, pertimbangkan security dalam production image. Gunakan non-root user dengan directive USER. Hindari bind mount ke container production. Scan image secara reguler untuk vulnerabilities dengan tools seperti Trivy atau Snyk.

Image yang kecil dan secure adalah fondasi deployment yang reliable. Multi-stage build adalah teknik fundamental yang harus dikuasai setiap DevOps engineer dan backend developer.

Siap menguasai Docker dan modern DevOps practices? Daftar DevOps Engineering Bootcamp di Rumah Coding. Hands-on labs dengan Kubernetes, CI/CD pipelines, dan cloud deployment strategies.

Course Terkait

EduStream - Mini Learning Management System (LMS)
Premium Course Web App

MERN Stack Development

Launch your journey into full-stack web development with this comprehensive, project-driven course. Designed for beginners, this course demystifies the MERN stack (MongoDB, Express.js, React.js, Node.js) by guiding you step-by-step in building a real-world application from scratch. By the end of this course, you will have the practical skills and a complete portfolio project to confidently step into the modern web development industry.

Capstone Project

EduStream - Mini Learning Management System (LMS)

  • Secure Authentication & Authorization: Robust user registration and login using JWT, with strict role-based access control (Admin/Instructor vs. Student).
  • Course Management (Admin Dashboard): Full CRUD (Create, Read, Update, Delete) capabilities for administrators to manage course details, including titles, descriptions, pricing, and thumbnail image uploads.
  • Public Course Catalog: An interactive and responsive storefront where users can browse available courses.
7 Weeks Beginner
Lihat Detail Course

Artikel Terkait