# 베이스 이미지를 명시해준다.
FROM node:{Version}
# 모든 파일들을 포함시키기 위해서 (ex. package.json, app.ts)
COPY ./ ./
# 추가적으로 필요한 파일들을 다운로드 한다.
RUN npm install
#컨테이너 시작시 실행될 명령어들을 작성한다.
CMD [ "npm", "run","start"]
위가 기본틀의 예시이다. (NestJS 기준)
WORKDIR /usr/src/app
WORKDIR = 이미지 안에서 어플리케이션 소스 코드를 가지고 있을 디렉토리를 생성하는 것
이 디렉토리가 어플리케이션의 working 디렉토리가 된다.
문제점 및 사용이유
위 Dockerfile 에서는 COPY를 통해 한 번에 모든 파일을 불러왔지만 실제로는 조금 다르다.
FROM node:{Version}
WORKDIR /usr/src/app
COPY package.json ./
RUN npm install
COPY ./ ./
CMD [ "npm", "run","dev" ]
이러한 이유는 코드가 수정이 되고 다시 빌드를 할 때 발생한다. ( 위의 Dockerfile을 수정전, 아래의 Dockerfile을 수정후라 부르겠다. )
핵심 - Dockerfile을 빌드 할 때 캐싱이 발생한다.
그렇기 때문에 수정전에 경우 재빌드를 할 때 종속성이 변경된 것이 아니라 소스만 변경되었으면 package.json을 통해 다시 한 번 RUN npm install 을 수행하게 된다.
이에 따라 수정후의 경우는 소스 변경의 경우 npm install 이 따로 실행되지 않는다.
COPY package*.json ./
와 같이 써야한다.npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion@1, but package-lock.json was generated for lockfileVersion@2. I'll try to do my best with it!
또 위와 같은 에러가 나타났는데 이는 npm 버전에 나타났던 문제인데 핵심은 FROM node:{Version}
이 부분에서의 문제였다. package기존 방식은 COPY를 통해 도커 컨테이너에 새롭게 빌드하여 진행
Volume 방식은 도커 컨테이너에서 로컬의 소스들을 참조(Mapping) 하여 진행
docker run -d -p 4000:8080 -v /usr/src/app/node_modules -v $(pwd):/usr/src/app chsu00/hello-docker