MENU

nest js + docker + prisma を実装してみる

できること

nest js, primsa, mysql をdockerで構築する

手順

  1. nest をローカル環境に入れる
  2. dockerfile, docker-composeを作成
  3. prismaを入れる

完成コード

  • dockerfile
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"]
  • docker-compose
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:

詰まったこと

  1. 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:
  1. prismaマイグレーションができない

下記の様にすべての権限をユーザーにあげないと、 migrateできなかった

grant all CREATE, ALTER, DROP, REFERENCES ON *.* to prisma_user@localhost;
  1. docker内で nest と mysqlの環境を作る場合のmysqlのホスト

下記のprisma様に設定した様に、docker-compose で設定した様に、 mysqlになるみたい

DBだけ docker化した場合はhost はlocalhostだった

DATABASE_URL="mysql://user:password@mysql:3306/todo_app_db?schema=public"
  1. コンテナ内のdb接続
## 接続
docker-compose exec mysql bash

mysql -u root -p
※ MYSQL_ROOT_PASSWORDの内容で入る


## 権限状態を確認
SHOW GRANTS FOR 'user'@'%' ;
  1. 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

参考サイト

  • nest js docker化

qiita.com

  • nest jsにprismaを入れる

qiita.com

  • primsa migrateの権限エラー対応

zenn.dev