💫
Node.js Error: Cannot find module /usr/src/app/nodemon 에러 해결
December 16, 2022
1. 배경 상황
최근 데모 실습을 위해 Codepipeline + CodeCommit + Codebuild로 CI/CD 파이프라인 구축을 하고있는데, Codebuild에서 에러가 어마무시하게 나서 하나씩 정리해두려 한다. ‘Error: Cannot find module '/usr/src/app/nodemon'
에러는 pkg 모듈로 Node.js(Express 프레임워크) 프로젝트를 빌드하고 도커 이미지로 만드는 과정에서 발생했던 에러였다.
정확한 에러 메시지는 아래와 같았다.
node:internal/modules/cjs/loader:988
throw err;
^
Error: Cannot find module '/usr/src/app/nodemon'
at Function.Module._resolveFilename (node:internal/modules/cjs/loader:985:15)
at Function.Module._load (node:internal/modules/cjs/loader:833:27)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:22:47 {
code: 'MODULE_NOT_FOUND',
requireStack: []
}
2. 에러 해결
기존 Dockerfile을 다시 살펴보니 서버를 가동시키는 명령어를 nodemon으로 해두었었다. 로컬로 접속 테스트를 했었을 당시에 서버 재부팅이 귀찮아서 -g
모드로 nodemon을 설치해서 사용 중이었는데, 도커파일을 작성할 때에도 습관적으로 nodemon을 사용했었던 것.
FROM node:16
# 앱 디렉터리 생성
WORKDIR /usr/src/app
# 앱 의존성 설치
COPY package*.json ./
RUN npm install
# 앱 소스 파일 추가
COPY . .
RUN ls -al
EXPOSE 8090
CMD ["nodemon", "./server.js"]
해결 방법은 package.json에 nodemon을 포함해주거나, 서버 기동을 위한 명령어를 기본 명령어인 node로 바꿔주는 방법이 있는데, 나는 이미지를 최대한 가볍게 만들고 싶어서 명령어를 기본 명령어로 바꿔주었다.
FROM node:16
# 앱 디렉터리 생성
WORKDIR /usr/src/app
# 앱 의존성 설치
COPY package*.json ./
RUN npm install
# 앱 소스 파일 추가
COPY . .
RUN ls -al
EXPOSE 8090
CMD ["node", "./server.js"]
이렇게 도커파일을 변경하고 다시 재빌드 하니 문제없이 도커빌드가 진행되었다.