개발을 하는 도중에 아래와 같은 문제가 생겼습니다.
결국 정상적으로 서버가 켜져서 지장은 없었지만 한 번 앱을 로드 할때마다 아래와 같은 수많은 에러 메세지들이 너무 불편했으며, 전 프로젝트를 진행했을때는 이 문제로 인하여 앱이 켜지지 않는 상황까지 발생했기때문에 추후 문제 발생을 막기 위해 문제를 해결하고자 합니다.
Mysql을 load하는 도중에 TypeOrm Error라던지, 환경설정 문제로 load가 늦어지는 상황입니다. Docker설정에서 저의 Nest서버는 Mysql에 의존하고 있는 상태입니다.
즉, 순서는 Mysql → Nest 순서로 켜져야 하는 상황인데 현재 Mysql의 load시간이 오래 걸리는 바람에 Nest서버에서 에러 메세지를 계속 저에게 띄우고 있습니다.
Nest서버는 켜질 준비가 되어있는데, Mysql이 load가 되지 않는 바람에 자신도 load가 될 수 없다라는 상황이기 때문에 위 사진과 같은 에러가 계속 발생하는 상황입니다.
이 문제를 해결하기 위해서 wait-for-it 스크립트를 적용시키려고 합니다.
wait-for-it 스크립트는 Docker 설정에서 유용하게 쓰입니다. 여러 Docker Container들을 동시에 실행해야 할 때, 각각의 Container들의 실행 순서들을 지정해줍니다.
제 프로젝트에 적용시켜보겠습니다. Nest서버는 Mysql이 완전히 load되기 전에 실행이 되어 위의 에러메세지와 같은 에러들을 발생시킬 수 있습니다.
그래서 wait-for-it 스크립트를 적용시키면 Nest서버는 Mysql이 완전히 load되기 전까지 기다리며 Mysql이 완전히 load가 되면 그때 Nest서버를 load시키면서 위와 같은 에러들을 차단할 수 있습니다.
[1][wait-for-it.sh](http://wait-for-it.sh) 설치
curl https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh -o wait-for-it.sh
위의 명령어를 프로젝트 터미널창에 입력합니다.
위의 사진과 같이 wait-for-it.sh이 생성된 걸 확인할 수 있습니다.
[2] Dockerfile 수정
FROM node:15
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
RUN npm install -g nodemon
COPY wait-for-it.sh /usr/wait-for-it.sh //추가
RUN chmod +x /usr/wait-for-it.sh //추가**
COPY . .
EXPOSE 8080
CMD ["nodemon", "src/main.ts"]
wait-for-it 스크립트를 복사하고, 권한 설정까지 해줍니다.
[3] docker-compose.yml 수정
version: '3'
services:
nest:
container_name: And-You-Backend
image: nest
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:8080"
depends_on:
- db
- neo4j
environment:
- DB_HOST=${DB_HOST}
- DB_PORT=${DB_PORT}
- DB_USER=${DB_USER}
- DB_PASSWORD=${DB_PASSWORD}
- DB_NAME=${DB_NAME}
volumes:
- .:/usr/src/app
- /usr/src/app/node_modules
command: ["/usr/wait-for-it.sh", "db:3306", "--", "npm", "start"] //추가**
Nest 서버에 command를 추가하여 Mysql이 실행되기 전까지 기다리도록 합니다.
설정을 마친뒤에 다시 Docker를 켜봅시다.
더이상 에러메세지가 뜨지 않고 정상적으로 nest서버가 실행되는 걸 확인할 수 있습니다.