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→ container3000 - 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_moduleshost 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.jsdi local - ❌ Menghapus devDependencies
- ❌ Tidak ignore
node_modules
Best Practice #
1. Jangan Gunakan npm run build
#
Local dev harus:
start:devwatch: 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