[TypeORM] CLI 환경에서 Migration 하기 (with NestJS)

2024. 6. 16. 14:55NestJS

NestJS와 TypeORM을 사용하며 database에 대한 Migration을 파일로 따로 관리하였다. https://hopedevelopment.tistory.com/93

 

이슈 해결 - [TypeORM] DB migration file generate

TypeORM을 이용하던 도중 migration을 위한 명령어를 통하여 migration file을 생성하려고 했다. migration file을 생성하기 위한 명령어는 create와 generate가 있다. typeorm migration:create ./path-to-migrations-dir/PostRefac

hopedevelopment.tistory.com

 

Migration파일을 TypeScript로 저장하였기에 개발하며 사용하기 편하도록 ts-node로 migration 명령어를 실행시켰다.

/// package.json
/// scripts 부분
"migrate:run": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js migration:run --dataSource src/config/data-source.config.ts"

 

Docker와 NestJS를 같이 사용하는 경우 위와 같은 명령어로 migration하면 문제가 발생한다.

일단 대부분의 NestJS를 Docker를 이용하여 이미지를 build하는 경우 용량을 줄이기 위하여 development와 production 2가지 Multi Stage로 작성한다. (현재 필자는 npm을 사용합니다. 따라서 이 글은 npm 기준으로 설명합니다.)

 

production stage에서 docker는 아래와 같은 명령어를 수행하게 된다.

RUN npm install --only=production

 

그러면 devDependencies가 아닌 dependencies에 있는 패키지만 설치된다. 그렇다면 typescript와 ts-node가 설치되지 않아 결국 container를 실행하면 다른 방법을 사용해야 한다.

 

기존 migration:run script 명령어를 보면 알 수 있듯이 typeorm에는 cli.js라는 javascript 파일이 존재하였다.

이는 cli.js파일을 통한다면 typeorm관련 cli를 할 수 있다는 이야기다.

 

이를 통하여 다음과 같이 script 명령어를 수행할 수 있다.

/// package.json
/// scripts 부분
"migration:run": "node node_modules/typeorm/cli.js migration:run -d dist/src/config/data-source.config.js"

 

 

현재는 src가 아닌 rootDirectory에 database라는 디렉토리에 data-source.config.ts과 migrations라는 디렉토리를 만들어 모든 migration 파일들이 생성 및 실행될 수 있게 하였으며 Docker파일은 아래와 같이 2가지 stage로 구성하였습니다.

FROM node:18-alpine as development

WORKDIR /app

COPY . .

RUN npm install
RUN npm run build

FROM node:18-alpine as production

ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}

WORKDIR /app

COPY --from=development /app/dist /app/dist
COPY --from=development /app/package.json .
COPY --from=development /app/package-lock.json .
COPY --from=development /app/.env .

RUN npm install --only=production

EXPOSE 3000

CMD ["node", "dist/src/main.js"]

 

실제 container에서 해보면 잘 된다.

container 시작
돌아가는 container
container에서 cli로 migration:run 실행하기

 

읽다가 틀린 부분이 있으면 알려주시면 감사하겠습니다.

'NestJS' 카테고리의 다른 글

[NestJS] TypeORM 설정  (0) 2024.04.21
이슈 해결 - [TypeORM] DB migration file generate  (2) 2024.04.21