새롭게 배포할 API의 관리를 더 쉽게하기 위해, Docker와 PM2를 사용하기로 마음먹었다.
이를 설정한 방법을 알아보자.
// package.json
"scripts":{
"build" : "babel src -d dist", // ES6 문법의 src를 순수한 javascript로 트랜스 컴파일
"migrate:dev" : "dotenv -e .env.dev prisma migrate dev" // prisma를 이용하여 migration용 sql 생성 및 개발 db에 적용
"migrate" : "dotenv -e .env.production prisma migrate deploy", // migrate:dev를 통해 생성한 sql을 production db에 적용
}
위와 같은 설정을 통해, 배포과정에서 script를 사용 할 수 있게 하였다.
# Dockerfile
# Node version 세팅
FROM node:14.17.3
# WORKDIR 설정
WORKDIR /usr/app
# DB 폴더 생성
RUN mkdir -p /usr/app/db
# 의존성 파일 COPY
COPY package*.json ./
# 의존성 설치
RUN yarn install
RUN yarn global add pm2
# 소스 추가
COPY . .
# generate prisma client
RUN yarn prisma generate
# build
RUN yarn build
# 포트 매핑
EXPOSE 8080
# CMD
CMD ["pm2-runtime", "start", "ecosystem.config.js"]
#.dockerignore
node_modules
Docker 이미지를 build하기 위한, Dockerfile과 .dockerignore이다.
아래는 Dockerfile을 순차적으로 설명한 과정이다.
node 이미지를 기반으로 컨테이너를 생성하고, 의존성을 설치
Docker 컨테이너 내에서 사용하기 위한 pm2를 global로 설치
그 후 prisma 설정을 위해 prisma generate를 진행
package.json에서 정의한 build를 진행하였다.
그리고 포트를 매핑하고, 미리 정의해놓은 ecosystem.config.js
파일을 pm2로 실행
pm2-runtime
은 docker container내에서 사용 할 수 있는 pm2 명령어이다.
그냥 pm2
는 docker container에서 작동하지 않는다고 한다.
// ecosystem.config.js
module.exports = {
apps:[
{
name: 'api', // 프로세스 이름
script: './dist/index.js', // 실행할 app
instances: 1, // process 1개
exec_mode: 'cluster',
env: { NODE_ENV : 'production' }, // 환경 변수
},
],
};
ecosystem.config.js 라는 파일을 생성하여 docker내에서 실행하게하였다.
아래 링크에서 자세한 설명을 볼 수 있으니 참고하자.
https://engineering.linecorp.com/ko/blog/pm2-nodejs/
위와 같이 설정하고 docker container를 실행하면 실행한 뒤에도
pm2를 통해 손쉽게 로그를 파악할 수 있고 현재 앱의 상태를 파악 할 수 있다.
Docker는 신이다