Docker 컨테이너에서 Node.js 풀스택 앱 실행 시 흔한 문제 해결 가이드

2025. 7. 30. 23:12·개발

Node.js와 React 기반의 풀스택 애플리케이션을 Docker 컨테이너에 배포할 때 마주칠 수 있는 흔한 문제들과 해결책을 정리했습니다. ERR_EMPTY_RESPONSE, ENOENT: no such file or directory, ReferenceError: __dirname is not defined와 같은 오류를 해결하는 데 도움이 될 것입니다.

1. ERR_EMPTY_RESPONSE 또는 ERR_CONNECTION_REFUSED

증상

  • Docker 컨테이너를 실행하고 localhost:3000으로 접속했을 때 브라우저에서 연결 오류 발생
  • Docker logs에서는 서버가 정상적으로 시작된 것처럼 보임
  • 실제로는 외부에서 접근할 수 없는 상태

원인

Docker 컨테이너의 포트 매핑(-p 3000:3000)과 Node.js 애플리케이션이 실제로 리스닝하는 포트가 일치하지 않거나, 애플리케이션이 localhost (127.0.0.1)와 같이 컨테이너 내부에서만 접근 가능한 주소에서 리스닝하고 있기 때문입니다.

해결책

애플리케이션이 0.0.0.0 주소에서 리스닝하도록 수정하여 컨테이너 외부에서 접근 가능하게 만듭니다.

// server/index.ts
const port = parseInt(process.env.PORT || '3000', 10);

server.listen({
  port,
  host: "0.0.0.0", // 모든 네트워크 인터페이스에서 리스닝
}, () => {
  console.log(`Server running on port ${port}`);
});

 

2. ENOENT: no such file or directory

증상

ENOENT: no such file or directory, open '/app/dist/client/index.html'

컨테이너 로그에 위와 같은 오류가 발생하며, 서버가 빌드된 프론트엔드 파일 대신 개발 환경의 소스 파일을 찾으려고 시도합니다.

원인

Node.js 애플리케이션이 NODE_ENV=production 환경 변수를 제대로 인식하지 못하고 개발 모드로 실행되고 있기 때문입니다. 서버 진입점에서 환경 변수를 강제로 development로 설정하는 코드가 있을 수 있습니다.

해결책

서버 진입점에서 환경 변수를 강제로 설정하는 코드를 제거합니다.

// server/index.ts
const app = express();
// app.set('env', 'development'); // ❌ 이 줄을 제거하세요
app.use(express.json());

Dockerfile에서 환경 변수가 올바르게 설정되었는지 확인합니다:

ENV NODE_ENV=production

 

3. ReferenceError: __dirname is not defined

증상

ReferenceError: __dirname is not defined

ESM(ES Module) 환경에서 __dirname 사용 시 발생하는 오류입니다.

원인

package.json에 "type": "module"이 설정되어 있을 때, __dirname과 같은 CommonJS 전역 변수를 사용할 수 없습니다.

해결책

ESM 환경에서 __dirname을 사용할 수 있도록 재정의합니다.

// server/vite.ts (또는 __dirname을 사용하는 파일)
import { fileURLToPath } from 'url';
import path from 'path';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// 이제 __dirname을 기존처럼 사용할 수 있습니다
export function serveStatic(app: Express) {
  const distPath = path.resolve(__dirname, "..", "public");
  // ...
}

 

4. parent snapshot does not exist

증상

ERROR: failed to prepare extraction snapshot "..." parent snapshot "..." does not exist: not found

Docker 빌드 중 캐시 관련 오류가 발생합니다.

원인

Docker의 빌드 캐시가 손상되어 이전에 캐시된 레이어를 찾을 수 없을 때 발생합니다.

해결책

--no-cache 플래그를 사용하여 캐시 없이 처음부터 다시 빌드합니다.

docker build --no-cache -t your-image-name .

추가 팁: 완전한 재배포 프로세스

문제 해결 후 변경사항을 적용하려면 다음 단계를 따라주세요:

# 1. 기존 컨테이너 중지 및 제거
docker stop your-container-name && docker rm your-container-name

# 2. 이미지 다시 빌드 (필요시 --no-cache 사용)
docker build -t your-image-name .

# 3. 새 컨테이너 실행
docker run -d --name your-container-name --env-file .env -p 3000:3000 your-image-name

# 4. 로그 확인
docker logs your-container-name

권장 Dockerfile 구조

위 문제들을 방지하기 위한 기본적인 Dockerfile 구조입니다:

FROM node:18-alpine

WORKDIR /app

# 의존성 설치
COPY package*.json ./
RUN npm ci --only=production

# 애플리케이션 코드 복사
COPY . .

# 빌드
RUN npm run build

# 환경 변수 설정
ENV NODE_ENV=production
ENV PORT=3000

# 포트 노출
EXPOSE 3000

# 애플리케이션 실행
CMD ["npm", "start"]

 

'개발' 카테고리의 다른 글

Node.js 앱 무중단 배포: GitHub Actions와 Docker로 EC2 자동화 파이프라인 구축하기  (5) 2025.08.02
GitHub Actions을 활용한 도커 이미지 빌드 및 EC2에 배포하는 과정  (2) 2025.07.31
프롬프트 엔지니어링 작성 방법  (1) 2025.07.12
MCP 사용기(Claude Desktop을 활용하여 Firecrawl, slack 연동)  (4) 2025.07.05
책 정리 - 함께 자라기  (1) 2025.05.18
'개발' 카테고리의 다른 글
  • Node.js 앱 무중단 배포: GitHub Actions와 Docker로 EC2 자동화 파이프라인 구축하기
  • GitHub Actions을 활용한 도커 이미지 빌드 및 EC2에 배포하는 과정
  • 프롬프트 엔지니어링 작성 방법
  • MCP 사용기(Claude Desktop을 활용하여 Firecrawl, slack 연동)
5jyan5
5jyan5
  • 5jyan5
    jyan
    5jyan5
  • 전체
    오늘
    어제
    • 분류 전체보기 (242)
      • 김영한의 스프링 핵심 원리(기본편) (8)
      • 김영한의 스프링 핵심 원리 - 고급편 (11)
      • 김영한의 스프링 MVC 1편 (1)
      • 김영한의 스프링 DB 1편 (3)
      • 김영한의 스프링 MVC 2편 (3)
      • 김영한의 ORM 표준 JPA 프로그래밍(기본편) (9)
      • 김영한의 스프링 부트와 JPA 활용2 (2)
      • 김영한의 실전 자바 - 중급 1편 (1)
      • 김영한의 실전 자바 - 고급 1편 (9)
      • 김영한의 실전 자바 - 고급 2편 (9)
      • Readable Code: 읽기 좋은 코드를 작성.. (2)
      • 김영한의 실전 자바 - 고급 3편 (9)
      • CKA (118)
      • 개발 (37)
      • 경제 (4)
      • 리뷰 (1)
      • 정보 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      빈 후처리기
      cglib
      스레드
      자바
      log trace
      typequery
      @discriminatorvalue
      jpq
      조회 성능 최적화
      고급
      JPQL
      jdk 동적 프록시
      hibernate5module
      양방향 맵핑
      WAS
      프록시 팩토리
      페치 조인
      Thread
      버퍼
      김영한
      프록시
      Target
      gesingleresult
      단방향 맵핑
      락
      reentarantlock
      @within
      @discriminatorcolumn
      requset scope
      @args
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.2
    5jyan5
    Docker 컨테이너에서 Node.js 풀스택 앱 실행 시 흔한 문제 해결 가이드
    상단으로

    티스토리툴바