Node.js 앱 Docker로 배포 자동화하기
서버에 SSH로 접속해서 git pull, npm install, pm2 restart를 매번 손으로 치는 게 지겨워서 배포를 자동화하기로 했다.
Dockerfile 작성
멀티 스테이지 빌드로 나눠서 빌드 단계와 실행 단계의 이미지를 분리했다. 최종 이미지 용량을 줄이는 데 꽤 효과가 있었다.
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
처음엔 node:20 풀 이미지를 썼는데, alpine으로 바꾸니 이미지 크기가 꽤 줄어들었다.
GitHub Actions로 자동 배포
main 브랜치에 푸시되면 이미지를 빌드해서 레지스트리에 올리고, 서버에서 새 이미지를 pull 받아 컨테이너를 재시작하는 흐름으로 구성했다.
겪었던 삽질
환경변수를 이미지에 하드코딩했다가 실수로 커밋할 뻔한 적이 있어서, 이후로는 무조건 배포 시점에 환경변수를 주입하는 방식으로 바꿨다. .env 파일은 이미지에 절대 포함시키지 않는 게 맞는 것 같다.