Nodejs

 

NestJS MSA 환경에서 User Service의 Docker Compose 구성 방법

이번 강의에서는 NestJS 기반 MSA(Microservice Architecture) 구조에서 User Service를 어떻게 PostgreSQL과 함께 Docker 환경에서 실행하는지 설명합니다. Dockerfile과 docker-compose.yml 구성, 그리고 주의할 점들을 실습 중심으로 살펴봅니다.

 

???? 목표: NestJS 기반 user 서비스와 PostgreSQL DB를 Docker Compose로 연결하고 실행하기

 

✅ Dockerfile 구성 (user 서비스 전용)

FROM node:18-alpine AS development

WORKDIR /usr/src/app

# PNPM 설치
RUN corepack enable && corepack prepare pnpm@8.15.4 --activate

# package, lock, 설정 파일 복사
COPY package*.json ./
COPY pnpm-lock.yaml ./
COPY tsconfig.json tsconfig.json
COPY nest-cli.json nest-cli.json

# 의존성 설치
RUN pnpm install

# 전체 소스 복사
COPY . .

# 앱 실행
CMD ["pnpm", "run", "start:dev", "user"]

 

■ 핵심 설명:

  • corepack을 사용하여 pnpm 설치

  • 의존성 설치 최적화를 위해 설정파일 먼저 복사

  • 마지막에 전체 소스를 복사한 뒤 실행 커맨드 지정

 

 

■  PostgreSQL과 연결된 docker-compose.yml 구성

services:
  user:
    build:
      context: .
      dockerfile: ./apps/user/Dockerfile
      target: development
    command: pnpm run start:dev user
    depends_on:
      postgres_user:
        condition: service_healthy
    ports:
      - "3001:3000"
    volumes:
      - .:/usr/src/app
      - /usr/src/app/node_modules

  postgres_user:
    image: postgres:16
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: postgres
    ports:
      - "6001:5432"
    volumes:
      - ./postgres/user:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 10
      start_period: 5s

 

 

■ 구성 포인트:

  • user 서비스는 PostgreSQL이 정상 구동된 후에 실행되도록 depends_on + healthcheck 설정

  • DB 볼륨은 ./postgres/user로 지정하여 로컬에도 데이터가 저장됨

  • DB 포트는 5432 → 6001로 매핑

 

■  .dockerignore 파일 설정

버전 바꾸기전에 필요한 파일 제외 및 빠른 빌드 위해 다음 파일 설정

node_modules
dist
.git
.gitignore
Dockerfile
docker-compose.yml
*.log
*.env

 

✅ 이유:

  • node_modules는 pnpm 특성상 내부에 하드링크, symlink가 많아 Docker build 시 오류 유력

  • .dockerignore에 포함하면 빌드 캐시가 계속 저지됩

오류 예시: failed to checksum file node_modules/.pnpm/...: archive/tar: unknown file mode ?rwxr-xr-x

 

 실행 명령어

docker compose build --no-cache
docker compose up

--no-cache를 통해 빌드 캐시 없이 꽤기로 재빌드합니다.

 

 

???? 실행 후 확인

  • user 서비스: http://localhost:3001

  • postgres_user: 내부 포트 5432, 외부 포트 6001로 열리며 DB Tool로 확인 가능

 

 

✅ 요약 정리

  • Dockerfile은 설정/의존성 복사를 분리해 캐시 최적화

  • docker-compose.yml에 DB와 서비스를 함꿙 정의하고 healthcheck로 실행 순서 제어

  • .dockerignore 설정은 반드시 필요하며, 특히 pnpm 사용 시 중요

  • volume을 통해 node_modules는 컨테이너 외부와 연동해 관리

 

 

 

 

about author

PHRASE

Level 60  라이트

이 세상에서 가장 비극적인 삶이란 살아 있는 동안 인간의 정신이 죽어 있는 삶을 이른다. -알베르 슈바이처

댓글 ( 0)

댓글 남기기

작성