Using Docker with Node.js During Development

Guide from official docker1 docs was sufficient to get this going.

Prerequisites

  1. Have Node.js Installed. 2
  2. Have Docker Installed 3

Create a Docker Image

# Dockerfile.dev
FROM node:20-alpine

RUN npm install -g pnpm

WORKDIR /app

COPY package.json package.json
# Was using pnpm workspaces, you can copy the lock file w.r.t your package manager
COPY package-lock.json package-lock.json

RUN pnpm install

COPY . .

EXPOSE 8080

CMD ["pnpm", "run", "dev"]

Run a container from the image

# docker-compose.dev.yml
services:
  users:
    container_name: users
    build:
      context: .
      dockerfile: Dockerfile.dev
    ports:
      - '8080:8080'
    env_file:
      - .env
    depends_on:
      db:
        condition: service_healthy
    networks:
      users:
        ipv4_address: 172.18.0.3

  db:
    container_name: db
    image: postgres
    restart: always
    volumes:
      - db-data:/var/lib/postgresql/data
    user: postgres
    environment:
      - PGUSER=postgres
      - POSTGRES_DB=app_name
      - POSTGRES_PASSWORD=postgres
    ports:
      - '5432:5432'
    healthcheck:
      test: ['CMD', 'pg_isready']
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      users:
        ipv4_address: 172.18.0.2

volumes:
  db-data:

networks:
  users:
    driver: bridge
    ipam:
      config:
        - subnet: 172.18.0.0/16
          gateway: 172.18.0.1

Running the container

$ docker compose -f docker-compose.dev.yml up --build

Notes

Since I used for development purpose, I addded .dev extension to each for clear separation of what it's being used for.

For production docker images I prefer to directly use Dockerfile and docker-compose.yml instead.

Other References

Footnotes

  1. https://docs.docker.com/guides/language/nodejs/develop/

  2. https://nodejs.org/en

  3. https://www.docker.com/