-
배포 - Application소스 변경으로 다시 재build 시 효율적으로 하는 법Infra/CI-CD 2022. 12. 25. 18:43
어플리케이션 소스 변경으로 다시 빌드하는 것에 대한 문제점
어플리케이션을 만들다 보면 소스 코드를 계속 변경시켜줘야 하며 그에 따라 변경된 부분을 확인하면서 개발을 해나가야 합니다. 그래서 도커를 이용해서 어떻게 실시간으로 소스가 반영되게 하는지 알아 보겠습니다.현재까지 도커 컨테이너로 어플을 실행한 순서
소스코드를 계속 변경시켜 변경 된 부분을 어플리케이션에 반영시키려면 위 그림과 같은 과정을 (이미지 부터)다시 반복해야 한다.
local에 있는 server.js 코드 변경
소스를 바꾼이후에 해당 localhost환경에 접속해도 화면에는 여전히 "Hello World"가 표시된다.
위 과정을 반복하는 것의 비효율적인 점들
1. COPY ././ 이 부분때문에 소스에 변화를 시킨 부분은 server.js 뿐인데 모든 node_module이 있는 종속성까지 다시 다운 받아야한다.
2. 그리고 소스 하나를 변경 시켰을 뿐인데 이미지를 다시 생성하고 다시 컨테이너를 실행시켜주어야 된다.
Application소스 변경으로 다시 재build 시 효율적으로 하는 법
FROM node:10 WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . . EXPOSE 8070 CMD ["node","server.js"]
COPY명령어를 2번 쓰고 위쪽의 COPY는 먼저 종속성 설치에 대한 정보를 담고 있는 package.json만 복사를 먼저 해준뒤에 npm install 명령어를 통해 필요한 종속성들을 다운 받아준다.
그 다음에 다시 COPY명령어를 통해 전제 코드를 다시 복사해주는 것이다.
이유는 npm install 할때 불 필요한 다운로드를 피하기 위해서 이다. 종속된 모듈을 다시 받는 것은 종속된 모듈에 변화가 생길때 즉 package.json에 모듈에 변화가 생겨야지 RUN 명령어의 npm install이 실행된다.
하지만 RUN 명령어가 있기 전 COPY ./ ./ 로 모든 코드(디렉토리와, 파일을)일괄 복사하면 Docker는 소스토드 전체중에 변화가 생긴 것만 알 수 있을 뿐 그 변화가 package.json 에서 생긴 것인지 그 밖에서 생긴 것인지 구분 할 수 없다.
하지만 2개의 COPY 명령어로 package.json에 변경이 없다는 걸 Docker에게 인식 시켜주면 Docker는 RUN 명령어의 npm install로 새로 종속성을 설치하지 않고, 캐싱된 종속성 설치결과를 가져온다.
실제로 build를 다시 해보면 종속성에 관련된 COPY 명령어와 RUN 명령어는 CACHED한 내용를 가져다 사용하는 것을 확인 할 수 있다.
'Infra > CI-CD' 카테고리의 다른 글
배포 - Docker Compose에 대하여 (0) 2022.12.31 배포 - Docker Volumes에 대하여 (0) 2022.12.30 배포 - WORKING DIRECTRORY 명시해 주기 (0) 2022.12.25 배포 - 생성한 이미지로 app 실행 시 접근이 안되는 이유(포트 맵핑) (0) 2022.12.25 배포 - Dockerfile를 이용해서 Docker image build (0) 2022.12.25