ExpressJS #
Express.js adalah framework web Node.js yang minimalis, fleksibel, dan menjadi fondasi bagi banyak backend JavaScript modern. Express sering dipilih untuk:
- REST API
- Backend for Frontend (BFF)
- Microservice sederhana
- Prototype cepat hingga production-ready service
Namun, pada tahap local development, aplikasi Express sering menghadapi masalah klasik:
- Versi Node.js berbeda antar developer
- Dependency native (
bcrypt,sharp, dll.) bermasalah - Environment variable tidak konsisten
- Onboarding developer baru memakan waktu
Di sinilah Dockerfile dan Docker Compose berperan sebagai penyetara environment.
Artikel ini membahas secara mendetail dan rinci:
- Dockerfile untuk aplikasi Express.js (development mode)
- Docker Compose sebagai orkestrator local development
Fokus utama: development, bukan production.
Filosofi Docker Express #
Tujuan Docker di local dev:
- Menyamakan versi Node.js
- Mengisolasi dependency native
- Menjaga workflow tetap sederhana
- Mempermudah kolaborasi tim
Bukan tujuan utama:
- Image sekecil mungkin
- Security hardening ekstrem
- Optimasi runtime
Local development mengutamakan kecepatan iterasi dan konsistensi, bukan efisiensi image.
Gambaran Arsitektur #
Arsitektur umum:
Developer
|
v
Docker Compose
|
+--> express-app (nodemon)
|
+--> database (optional)
Struktur Project Express #
Struktur project yang diasumsikan:
.
├── src/
│ └── index.js
├── package.json
├── package-lock.json / yarn.lock / pnpm-lock.yaml
├── Dockerfile
├── docker-compose.yml
├── .env
└── .dockerignore
Karakteristik Express #
Hal penting terkait Express:
- Tidak memiliki server bawaan → berjalan di atas Node.js
- Sering menggunakan nodemon untuk reload
- Mengandalkan environment variable
Implikasi Docker:
- Perlu bind ke
0.0.0.0 - Volume mount wajib agar reload berjalan
- Dev dependency harus tersedia
Dockerfile untuk Express.js #
FROM node:20-alpine
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "run", "dev"]
Penjelasan Dockerfile #
1. Base Image #
FROM node:20-alpine
- Node LTS modern
- Alpine cukup ringan untuk dev
- Tidak disarankan image ultra-minimal
2. Working Directory #
WORKDIR /app
Menjaga path kerja konsisten dan rapi.
3. Cache Dependency #
COPY package.json package-lock.json ./
RUN npm install
Layer terpenting agar rebuild cepat.
4. Menjalankan Express #
CMD ["npm", "run", "dev"]
Biasanya npm run dev menjalankan nodemon:
"scripts": {
"dev": "nodemon src/index.js"
}
Docker Compose #
version: "3.9"
services:
api:
container_name: express-dev
build:
context: .
dockerfile: Dockerfile
ports:
- "3000:3000"
volumes:
- .:/app
- /app/node_modules
env_file:
- .env
environment:
- NODE_ENV=development
Penjelasan docker-compose.yml #
Service api
#
Port Mapping #
ports:
- "3000:3000"
Akses API melalui http://localhost:3000.
Volume Mount #
volumes:
- .:/app
- /app/node_modules
Makna penting:
- Source code sync real-time
node_modulestetap di container
Ini adalah best practice wajib untuk Node.js dev.
Environment Variable #
env_file:
- .env
- Konfigurasi tidak di-hardcode
- Aman dan fleksibel
Workflow Development #
- Jalankan stack:
docker compose up --build
- Edit kode di
src/ - Nodemon auto-reload
- Test via Postman / curl
Stop:
Ctrl + C
docker compose down
Kapan Setup Ini Tepat Digunakan? #
Cocok jika:
- Tim lintas OS
- API digunakan banyak service
- Onboarding developer sering
Kurang perlu jika:
- Project sangat kecil
- Script satu file
Anti-Pattern #
- ❌ Menggunakan image production untuk dev
- ❌ Tidak pakai volume → reload mati
- ❌ Install dependency di host dan container bersamaan
- ❌ Hardcode config di source code
Best Practice #
- Gunakan nodemon di container
- Isolasi
node_modules - Gunakan
.dockerignore - Jangan build production image untuk dev
Contoh .dockerignore:
node_modules
.git
.env
npm-debug.log
Penutup #
Dockerfile dan Docker Compose untuk Express.js local development seharusnya menekankan kesederhanaan, konsistensi, dan kecepatan iterasi.
Dengan setup yang tepat:
- Express tetap ringan
- Development lebih stabil
- Kolaborasi tim lebih mudah