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:

  1. Tidak memiliki server bawaan → berjalan di atas Node.js
  2. Sering menggunakan nodemon untuk reload
  3. 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_modules tetap 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 #

  1. Jalankan stack:
docker compose up --build
  1. Edit kode di src/
  2. Nodemon auto-reload
  3. 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 #

  1. Gunakan nodemon di container
  2. Isolasi node_modules
  3. Gunakan .dockerignore
  4. 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
About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact