NestJS #

NestJS adalah framework Node.js yang dirancang untuk membangun aplikasi backend yang terstruktur, scalable, dan maintainable, dengan memadukan konsep OOP, FP, dan DI (Dependency Injection). Dalam praktik nyata, pengembangan NestJS sering melibatkan banyak dependensi: Node.js versioning, database, message broker, cache, dan environment variable.

Di sinilah Docker berperan penting, terutama untuk local development:

  • Menyamakan environment antar developer
  • Menghindari konflik versi Node/npm
  • Memudahkan onboarding developer baru
  • Mendekati environment production sejak awal

Artikel ini akan membahas secara mendetail dan rinci bagaimana menyusun Dockerfile dan Docker Compose untuk local development aplikasi NestJS, termasuk best practice dan reasoning di balik setiap keputusan.

Karakteristik Docker NestJS #

Sebelum masuk ke implementasi, penting memahami bahwa Docker untuk local development berbeda dengan production.

Fokus utama local development: #

  • Hot reload (watch mode)
  • Source code di-mount sebagai volume
  • Image tidak perlu terlalu kecil
  • Build cepat, iterasi cepat
  • Debugging friendly

Yang tidak menjadi prioritas utama: #

  • Multi-stage build kompleks
  • Image sekecil mungkin
  • Hardening security tingkat production

Struktur Proyek NestJS #

nestjs-app/
├── src/
├── test/
├── prisma/            # (opsional)
├── .env
├── Dockerfile
├── docker-compose.yml
├── package.json
├── package-lock.json
├── nest-cli.json
└── tsconfig.json

Dockerfile NestJS #

Prinsip Desain Dockerfile #

Untuk local dev NestJS:

  • Gunakan Node LTS
  • Install dependency sekali
  • Jalankan NestJS dalam watch mode
  • Jangan copy source code ke image (gunakan volume)

Contoh Dockerfile #

FROM node:20-alpine

WORKDIR /app

# Copy dependency descriptor
COPY package.json package-lock.json ./

# Install dependencies
RUN npm install

# Copy file konfigurasi penting
COPY nest-cli.json tsconfig.json tsconfig.build.json ./

EXPOSE 3000

CMD ["npm", "run", "start:dev"]

Penjelasan Dockerfile #

FROM node:20-alpine #

  • Node.js 20 LTS
  • Alpine lebih ringan
  • Sudah cukup untuk local dev

WORKDIR /app #

  • Semua command dieksekusi di /app

COPY package.json package-lock.json ./ #

  • Memisahkan layer dependency
  • Docker cache tetap optimal saat source code berubah

RUN npm install #

  • Install semua dependency termasuk devDependencies
  • Dibutuhkan untuk start:dev

COPY nest-cli.json tsconfig*.json ./ #

  • Nest CLI butuh file ini saat runtime
  • Source code tidak dicopy (akan di-mount via volume)

CMD ["npm", "run", "start:dev"] #

  • Mengaktifkan hot reload via Nest CLI

Docker Compose #

Docker Compose berfungsi sebagai:

  • Orkestrator service
  • Pengelola environment variable
  • Penghubung antar container

Dalam local dev NestJS, Compose hampir selalu digunakan.

Contoh docker-compose.yml #

version: '3.9'

services:
  api:
    container_name: nestjs-api
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    volumes:
      - .:/app
      - /app/node_modules
    env_file:
      - .env
    command: npm run start:dev
    restart: unless-stopped

Penjelasan Docker Compose #

services.api #

Mendefinisikan satu service backend NestJS.

build #

build:
  context: .
  dockerfile: Dockerfile
  • Menggunakan Dockerfile lokal
  • Cocok untuk development custom

ports #

ports:
  - "3000:3000"
  • Port host 3000 → container 3000
  • Akses API via http://localhost:3000

volumes #

volumes:
  - .:/app
  - /app/node_modules

Volume pertama: Source Code #

  • Sinkronisasi real-time
  • Setiap perubahan langsung memicu reload

Volume kedua: Anonymous Volume #

  • Mencegah node_modules host menimpa container
  • Praktik WAJIB untuk Node.js

env_file #

env_file:
  - .env
  • Menjaga konfigurasi terpisah
  • Aman dan rapi

command #

command: npm run start:dev
  • Override CMD Dockerfile (opsional)
  • Eksplisit lebih jelas untuk dev

Integrasi Database #

Contoh PostgreSQL:

services:
  api:
    ...
    depends_on:
      - db

  db:
    image: postgres:16-alpine
    container_name: postgres-db
    environment:
      POSTGRES_USER: nest
      POSTGRES_PASSWORD: nest
      POSTGRES_DB: nest_dev
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:

Alur Kerja Developer #

# Build image
docker compose build

# Jalankan container
docker compose up

# Stop
docker compose down

Perubahan file → auto reload → tanpa rebuild.


Anti-Pattern #

  • ❌ Copy seluruh source code ke image
  • ❌ Tidak pakai volume
  • ❌ Menjalankan node dist/main.js di local
  • ❌ Menghapus devDependencies
  • ❌ Tidak ignore node_modules

Best Practice #

1. Jangan Gunakan npm run build #

Local dev harus:

  • start:dev
  • watch: true

2. Gunakan .dockerignore #

node_modules
.git
dist
.env

Menghindari context membengkak.

3. Selalu Mount Source Code #

Tanpa volume:

  • Tidak ada hot reload
  • Developer experience buruk

4. Bedakan Docker Dev vs Prod #

  • Dev: simple, fleksibel
  • Prod: multi-stage, minimal, secure

Jangan dicampur.


Penutup #

Docker + Docker Compose untuk local development NestJS bukan soal membuat image sekecil mungkin, tapi soal developer experience, konsistensi environment, dan kecepatan iterasi.

Dengan pendekatan:

  • Dockerfile sederhana
  • Volume-based hot reload
  • Docker Compose sebagai orkestrator

Anda mendapatkan setup yang:

  • Stabil
  • Mudah dirawat
  • Mendekati real-world environment
About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact