nest new nest-mysql
을 통해서 프로젝트를 하나 만든다.
이제 해야할 일은 docker의 mysql Image를 다운로드 하는 것이다.
제가 사용하는 하드웨어의 경우에는 m1 cpu를 사용하기때문에 amd cpu기반의 mysql이미지를 다운로드 받습니다.
mac m1 cpu의 경우
docker run --rm --platform linux/amd64 -it mysql:5.7
일반 intel cpu의 경우
docker pull mysql:8.0.17
을 사용하여 mysql image를 다운로드 받습니다.
여기서 질문이 있을 수 있습니다. intel칩의 경우 docker pull을 해서 image를 받는데 왜 mac의 m1은 docker pull이 아니라 docker run으로 받느냐 이경우에는 cpu의 차이로 이러한 문제가 나타나는 것으로 보입니다.
저는 m1을 사용하기때문에 m1을 가지고 터미널 창에서
docker run --rm --platform linux/amd64 -it mysql:5.7
를 입력완료 하였다면
mysql image가 생성된것을 확인할 수 있습니다. 그러나 run을 하면서 mysql
- MYSQL_ROOT_PASSWORD
- MYSQL_ALLOW_EMPTY_PASSWORD
- MYSQL_RANDOM_ROOT_PASSWORD
와 같은 정보를 입력하지 않았기때문에
2021-10-24 05:22:09+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.36-1debian10 started.
2021-10-24 05:22:10+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2021-10-24 05:22:10+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.36-1debian10 started.
2021-10-24 05:22:11+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
You need to specify one of the following:
- MYSQL_ROOT_PASSWORD
- MYSQL_ALLOW_EMPTY_PASSWORD
- MYSQL_RANDOM_ROOT_PASSWORD
와 같은 에러가 발생합니다. 따라서 이부분은 docker-compose를 통해서 설정하도록 하겠습니다.
docker-compose.yml
version: '3'
services:
local-db:
image: library/mysql:5.7
container_name: [컨테이너 이름]
restart: always
ports:
- [로컬 포트]:3306
environment:
MYSQL_ROOT_PASSWORD: [루트 유저 비밀번호]
TZ: Asia/Seoul
volumes:
- ./db/mysql/data:/var/lib/mysql
- ./db/mysql/init:/docker-entrypoint-initdb.d
platform: linux/x86_64
docker-compose.yml 적용예시
version: '3'
services:
local-db:
image: library/mysql:5.7
container_name: nest-mysql
restart: always
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: root
TZ: Asia/Seoul
volumes:
- ./db/mysql/data:/var/lib/mysql
- ./db/mysql/init:/docker-entrypoint-initdb.d
platform: linux/x86_64
위와 같이 작성을 해주고 난후 아직
docker-compose up
를 입력하지말고, nestjs의 typeorm을 사용하여 해당 nest-mysql을 연결하는 작업을 진행하겠습니다.
$ npm install --save @nestjs/typeorm typeorm mysql2
를 이용해서 nest프로젝트에서 위의 코드를 입력해줍니다.
app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'root',
database: 'mysql',
entities: [],
synchronize: true,
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
와같이 연결해줍니다. 그리고 나서 이제
docker-compose up -d
를 통해서 mysql을 열어주고
npm run start
를 통해서 nest프로젝트가 mysql과 제대로 연결되어있는지 확인하는 작업을 가집니다.