できること
nest js, primsa, mysql をdockerで構築する
手順
- nest をローカル環境に入れる
- dockerfile, docker-composeを作成
- prismaを入れる
完成コード
FROM node:18 as base
WORKDIR /app
# * で lockもか
COPY package*.json ./
RUN npm i
COPY . .
RUN npm run build
FROM base as dev
WORKDIR /app
COPY package*.json ./
RUN npm install
CMD ["npm", "run", "start:dev"]
version: '3'
services:
backend:
build:
context: .
volumes:
- ./:/app
ports:
- 3001:3001
depends_on:
- mysql
networks:
- backend
mysql:
image: mysql:8.0.27
platform: linux/amd64
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: mysql
MYSQL_DATABASE: todo_app_db
MYSQL_USER: user
MYSQL_PASSWORD: password
restart: always
networks:
- backend
networks:
backend:
詰まったこと
- docker-composeで nestjs と mysqlを接続するときに、networkを設定しないといけない
これは、下記で作成する場合、デフォルトではコンテナごとに別のネットワークを構築するらしい
version: '3'
services:
backend:
build:
context: .
volumes:
- ./:/app
ports:
- 3001:3001
depends_on:
- mysql
mysql:
image: mysql:8.0.27
platform: linux/amd64
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: mysql
MYSQL_DATABASE: todo_app_db
MYSQL_USER: user
MYSQL_PASSWORD: password
restart: always
なので下記のように networkを作成する必要がある
version: '3'
services:
backend:
build:
context: .
volumes:
- ./:/app
ports:
- 3001:3001
depends_on:
- mysql
networks:
- backend
mysql:
image: mysql:8.0.27
platform: linux/amd64
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: mysql
MYSQL_DATABASE: todo_app_db
MYSQL_USER: user
MYSQL_PASSWORD: password
restart: always
networks:
- backend
networks:
backend:
- prismaのマイグレーションができない
下記の様にすべての権限をユーザーにあげないと、
migrateできなかった
grant all CREATE, ALTER, DROP, REFERENCES ON *.* to prisma_user@localhost;
- docker内で nest と mysqlの環境を作る場合のmysqlのホスト
下記のprisma様に設定した様に、docker-compose で設定した様に、
mysqlになるみたい
DBだけ docker化した場合はhost はlocalhostだった
DATABASE_URL="mysql://user:password@mysql:3306/todo_app_db?schema=public"
- コンテナ内のdb接続
## 接続
docker-compose exec mysql bash
mysql -u root -p
※ MYSQL_ROOT_PASSWORDの内容で入る
## 権限状態を確認
SHOW GRANTS FOR 'user'@'%' ;
- M1 Mac で docker 利用のmysqlの設定でplatformの設定が必要
m1はこういうのがちょこちょこあるよね
mysql:
image: mysql:8.0.27
platform: linux/amd64
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: mysql
MYSQL_DATABASE: todo_app_db
MYSQL_USER: user
MYSQL_PASSWORD: password
restart: always
networks:
- backend
参考サイト
qiita.com
qiita.com
zenn.dev