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으로 시작
Docker 이미지에서 제외 할 파일 설정.
node_modules # node_modules을 copy하지 않고, package manager를 통해 설치 할 것.
npm-debug.log # debug log 제외
dockerize -wait tcp://mysqldb:3306 -timeout 20s # mysql 컨테이너가 실행 완료 될 때까지 최대 20초 대기
echo "Start server"
yarn prisma migrate dev --name init # prisma migrate 실행
node index.js # express 앱 실행
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/데이터베이스-이름'