Express - Prisma -MySQL을 Docker에서 실행하기

kshired·2021년 6월 3일
0

Dockerfile 작성하기

express 앱의 이미지를 만들기 위해 Dockerfile 작성.

FROM node:14 # 사용 할 Node.js의 version 

ENV DOCKERIZE_VERSION v0.2.0  # MySQL이 실행 된 후 Migrate를 진행하기 위해 설정
RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \  
    && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz

WORKDIR /usr/src/app	# 이미지안에 앱이 저장 될 Directory

COPY package*.json ./	# package 설치를 위해 미리 package.json 파일 COPY
COPY prisma/ ./         # prisma migraton 및 sync를 위해 schema COPY

RUN yarn install        # pacakge 설치

COPY . .                # 설치 후 다른 파일들을 WORKDIR로 COPY

RUN chmod +x docker-entrypoint.sh  # dockerize 설정 shell script
ENTRYPOINT ["sh","/usr/src/app/docker-entrypoint.sh"]

EXPOSE 8080    # 포트를 8080으로 시작

.dockerignore 작성하기

Docker 이미지에서 제외 할 파일 설정.

node_modules   # node_modules을 copy하지 않고, package manager를 통해 설치 할 것.
npm-debug.log  # debug log 제외

docker-entrypoint.sh

dockerize -wait tcp://mysqldb:3306 -timeout 20s  # mysql 컨테이너가 실행 완료 될 때까지 최대 20초 대기

echo "Start server"
yarn prisma migrate dev --name init  # prisma migrate 실행
node index.js                        # express 앱 실행

docker-compose.yml

version: '3'  # version은 3 이상을 권장

networks:  # compose를 이용해 실행 시킬 두 컨테이너의 통신을 위한 network 설정 
  app:
    driver: bridge
services:
  mysqldb:     # mysql 컨테이너
    networks:  # network 설정
      - app
    image: mysql:5.7
    restart: always
    container_name: mysqldb
    ports:
      - '3306:3306'
    environment:  # 이런 식으로 .env 파일의 환경변수도 가져 올 수 있음.
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_ROOT_PASSWORD=${DB_PASSWORD}
      - TZ=Asia/Seoul
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:    # db가 저장 될 위치
      - ./db/mysql/data:/var/lib/mysql
      - ./db/mysql/init:/docker-entrypoint-initdb.d
  server:      # express 앱 컨테이너
    networks:
      - app
    build:     # build 할 Dockerfile의 상대 위치
      context: .
    container_name: server
    ports:
      - '8080:8080'
    volumes:   # express 앱의 파일 위치
      - ./:/usr/src/app
      - /usr/src/app/node_modules
    depends_on:    # mysql이 server 컨테이너보다 먼저 실행 되게 하는 설정
      - mysqldb

위와 같이 설정 후,
docker-compose -f docker-compose.yml up을 실행하면 두 컨테이너가 함께 실행된다.

.env에 있는 prisma용 DATABASE_URL은 아래와 같이 설정하자.
DATABASE_URL='mysql://아이디:비밀번호@mysql-컨테이너-이름:3306/데이터베이스-이름'

profile
글 쓰는 개발자

0개의 댓글