개발자의 아늑한 집 로컬호스트에서는 모든 것이 아름답게 잘 맞물려서 돌아간다. 하지만 다른 컴퓨터에서도 그럴 것이라고는 보장할 수 없다. 그리고 내 경험상 배포가 한번에 됐던 적이 거의 없다.
최대한 동일한 환경를 유지하는 게 중요한데 그래서 우리에게는 package.json이 존재하는것. 그러나! 한가지 더 있다. pakage-lock.json이나 yarn.lock 파일로, 이것이 의존성 버전을 잠가주는데 자세한 건 구글에 다 나와있음.
우리가 npm을 쓰면 package-lock을 보는 게 맞고 yarn을 쓰면 yarn.lock을 보는 게 맞고, 그리고 둘 중 하나만 쓰는 게 맞다.
이걸 별로 중요하지 않게 생각하다가 생각치 못한 에러가 발생하기도 하니 지우지 않고 잘 보관해주어야 한다.
internal/modules/cjs/loader.js:582
throw err;
^
이런 에러가 발생할 때가 있다. 보통 패키지가 무엇인가 잘못되었을 때 일어나는데 해결법은 그냥 노드 모듈을 삭제하고 다시 설치해주는 것이다. 그런데 이러한 오류가 도커를 통한 자동 배포에서 일어날 수 있다.
도커 파일을 확인해보았다.
COPY package*.json ./
RUN yarn
COPY . .
대충 이런 식으로 되어있었다. 무엇이 문제일까?
상기의 내용은 package.json과 package-lock.json (와일드 카드로 인해) 파일을 모두 복사한 뒤 yarn으로 의존성 설치를 해준다.
응?
yarn을 쓰는데 package-lock을 복사해선 소용이 없다.
COPY package*.json ./
COPY yarn.lock ./
RUN yarn
COPY . .
추가해주니 문제가 허무하게 해결되었다!
다들 lock 파일의 중요성을 잊지말자.