Docker + Prisma + PM2 + Express + Babel 통합하기

kshired·2021년 7월 21일
0
post-thumbnail

새롭게 배포할 API의 관리를 더 쉽게하기 위해, Docker와 PM2를 사용하기로 마음먹었다.

이를 설정한 방법을 알아보자.

package.json : scripts

// 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

# 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을 순차적으로 설명한 과정이다.

  1. node 이미지를 기반으로 컨테이너를 생성하고, 의존성을 설치

  2. Docker 컨테이너 내에서 사용하기 위한 pm2를 global로 설치

  3. 그 후 prisma 설정을 위해 prisma generate를 진행

  4. package.json에서 정의한 build를 진행하였다.

  5. 그리고 포트를 매핑하고, 미리 정의해놓은 ecosystem.config.js 파일을 pm2로 실행

pm2-runtime은 docker container내에서 사용 할 수 있는 pm2 명령어이다.

그냥 pm2는 docker container에서 작동하지 않는다고 한다.

PM2 설정

// 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는 신이다

profile
글 쓰는 개발자

0개의 댓글