본문 바로가기

카테고리 없음

docker compose로 beanstalk 배포하기(nest.js)

1. docker-compose.yaml 파일 작성 : beanstalk는 docker-compose.yaml/yml을 그대로 사용할 수 있어서 

Dockerrun.aws.json파일을 따로 작성할 필요가 없음(내부적으로 compose 파일을 처리함)

version: '3.8'
services:
  app:
    image: app-image
    build:
      context: .
    ports:
      - '3000:3000'
    environment:
      DB_HOST: //DB호스트
      DB_PORT: //DB포트
      DB_USER: //DB 유저 네임
      DB_PASS: //DB 비번
      DB_NAME: //DB이름
    networks:
      - app-network

  nginx:
    image: nginx:latest
    ports:
      - '80:80' # 호스트 포트:컨테이너 포트
    depends_on:
      - app # nginx는 app이 먼저 시작된 후에 실행
    volumes:
      - ./ebextensions/nginx.conf:/etc/nginx/nginx.conf
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

 

beanstalk 는 기본적으로 80번 포트로 연결하기 때문에 제공해주는 도메인으로 열었을 때 바로 메인페이지가 뜨게하기 위해 호스트 포트를 80번으로 지정했다. 

 

 

2. dockFile 준비 

FROM node:20-alpine

WORKDIR /

COPY . .

RUN npm install
RUN npm run build

EXPOSE 3000
CMD ["npm", "run", "start:prod"]

 

 

WORKDIR 부분의 경로를 실제 dist 파일이 생성되는 경로를 작성해야 추후

아래와 같은 " Cannot find module dist\main  " 오류가 나지 않는다. 

 

Error: Cannot find module 'var/app\dist\main' at Function.Module._resolveFilename (node:internal/modules/cjs/loader:1039:15) at Function.Module._load (node:internal/modules/cjs/loader:885:27) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) at node:internal/main/run_main_module:23:47

 

FROM node:20-alpine

WORKDIR /var/app

COPY . .

RUN npm install
RUN npm run build

EXPOSE 3000
CMD ["npm", "run", "start:prod"]

 

기존 코드는 컨테이너 내의 작업 디렉토리를 var/app 으로 설정했으나 dist/main.js 는 루트에 생성되고 있었기 때문에 

빈스토크 모듈을 찾지 못하는 오류가 나서 배포를 빈번히 실패 했었다. dist 파일의 경로를 정확히 적어주므로서 해결,


3. beanstalk 어플리케이션을 도커 플랫폼으로 생성한다.

 

4. 파일 압축 

beanstalk는 배포하려는 소스코드의 압축파일만 있으면 손쉽게 배포가 가능하다,(?) 

docker compose를 이용한 배포 시 압축 파일 내에 아래 파일을 넣어준다.

  • docker-compose.yml
  • dockerFile
  • package.json
  • .env
  • 소스 코드가 들어있는 src 
  • 프론트 코드가 들어있는 public.. 등

 

5. 어플리케이션 배포를 위해 압축 파일을 올리고 10분 가량 기다린다.

 이때 npm install 과정에서 시간 초과가 날 수 있으니 dev dependency는 제외하고 인스톨하도록 dockerfile을 수정하거나 

안쓰는 라이브러리는 꼭 제때 정리하자. 

 

 

배포가 완료되면 OK 상태가 뜨며 도메인으로 접속이 가능해진다. 

 

실패요인

- dist 파일 경로 불일치 문제 

- docker 이미지 build 오류 

- DB 미연결 

- npm install 시간 초과  등