도커 - COPY, WORKING DIRECTORY, VOLUME

1. COPY


FROM node:10

WORKDIR /usr/src/app

COPY package.json ./

RUN npm install

COPY ./ ./

CMD ["node", "server.js"]
  • 말 그대로 로컬에 있는 파일을 도커 컨테이너에 복사하는 것
  • ./ ./ : 현재 디렉토리에 있는 모든 파일을 컨테이너의 ./로 복사
    • WORDIR 설정시 ./로 명시해도 WORKDIR로 복사되는데 아래서 다시 설명함
  • node에 관한 이야기
    • package.json은 의존성을 명시하는 곳이므로 대부분 변경되지 않음
    • package.json을 따로 copy하지 않고 한번에 ./ ./ 로 하면 계속 불필요하게 종속성을 다운받음
    • 둘이 분리해주면 종속성을 변경하지 않는 이상 캐시를 이용해 빠르게 빌드

2. Working Directory


  • 이미지안에서 어플리케이션 소스 코드를 갖고 있을 디렉토리를 의미
  • 이 디렉토리가 어플리케이션에 working 다랙토리가 된다.


Working Directory를 설정하는 이유

  • 베이스 이미지에 이미 같은 폴더명 혹은 파일명이 있을 가능성
  • 모든 파일이 한 디렉토리에 있는 경우 정리 X
  • 따라서 모든 어플리케이션을 위한 소스들은 Working Directory를 따로 만들어 보관
FROM node:10

WORKDIR /usr/src/app

COPY package.json ./

RUN npm install

COPY ./ ./

CMD ["node", "server.js"]
  • WORKDIR 설정시 컨테이너 접근하면 워크 디렉토리로 접근한다.
  • 카피도 ./ 로 카피하지만 워킹 디렉토리를 설정했다면 워킹 디렉토리로 카피된다.


3. Volume


그림1

  • 복사 : 로컬에 있는 것을 그대로 복사해와서 별개로 사용
  • Volume : 로컬에 있는 파일을 계속 인지하면서 변화를 반영


Volume 사용해서 애플리케이션 실행

FROM node:10

WORKDIR /usr/src/app

COPY package.json ./

RUN npm install

COPY ./ ./

CMD ["node", "server.js"]
docker run -d -p 5000:8080 -v /usr/src/app/node_modules -v $(pwd):/usr/src/app backtony/nodejs
  • 경로가 usr로 시작하는 이유는 dockerfile의 WORKDIR에 명시해줬기 때문
  • 첫 -v는 매핑시키지 않은 것인데 이것은 매핑하지 말라는 의미
  • 뒤의 -v는 pwd로 현재 디렉토리와 컨테이너 디렉토리를 :로 구분하여 매핑
  • -d 는 백그라운드 모드



본 포스팅은 인프런 John Ahn님의 ‘따라하며 배우는 도커와 CI환경’ 강의를 듣고 정리한 내용을 바탕으로 복습을 위해 작성하였습니다. [강의 링크]


© 2021. By Backtony