Oteto Blogのロゴ

NestJS × Prisma × PostgreSQL × Dockerで開発環境構築

タイトルの構成で、最低限開発が進められるところまでの環境構築をする。

環境構築手順

1. Dockerの設定

mkdir <PROJECT_NAME>
touch Dockerfile docker-compose.yml .dockerignore

1-1. Dockerfile

FROM node:18.14.1-alpine

WORKDIR /app

RUN npm i -g @nestjs/cli

1-2. docker-compose.yml

version: '3.8'
services:
  app:
    container_name: app-container
    build: .
    tty: true
    stdin_open: true
    volumes:
      - .:/app
      - /app/node_modules
    depends_on:
      - db
    environment:
      TZ: Asia/Tokyo
    ports:
      - '3000:3000'
      - '5555:5555'
        
  db:
    container_name: db-container
    image: postgres:15
    platform: linux/amd64
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pw
      TZ: 'Asia/Tokyo'
    ports:
      - '5432:5432'

1-3 .dockerignore

node_modules

1-4. ビルド

docker compose up -d --build
docker compose ps

上記コマンドを叩きコンテナが起動していればOK。

もしMac・Docker Desktopを利用していてビルドが失敗する際は下記の方法で解決するかも。

【Docker】ビルドが.docker/buildx/current:permission deniedとエラーになる

2. コンテナに入る

docker exec -it app-container sh

以後はコンテナ内で作業していく。

3. Nestプロジェクトの作成

nest new .
? Which package manager would you ❤️  to use? (Use arrow keys)
❯ npm 
  yarn 
  pnpm 

と聞かれるのでnpmを選択。

npm run start:dev

localhost:3000にアクセスしてHello World!が表示されればアプリ側はOK。

FROM node:18.14.1-alpine

WORKDIR /app

RUN npm i -g @nestjs/cli
COPY ./package.json .
COPY ./package-lock.json .
RUN npm install
CMD [ "npm", "run", "start:dev"]

以後は各種npmパッケージのインストールと開発環境立ち上げをコンテナ起動時に行いたいので、Dockerfileに追記しておく。

4. Prisma

4-1. 導入

npm i prisma @prisma/client
npx prisma init
DATABASE_URL="postgresql://user:pw@db:5432/mydb"

.envが自動で生成されるので、上記のようにDATABASE_URLpostgresql://<USER>:<PASSWORD>@<HOST>:<PORT>/<DATABASE>の形に書き換える。

ちなみにホストにlocalhostではなくDBのサービス名(db)を指定している背景は下記にまとめている。

4-2. マイグレーション

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}


model User {
  id             Int      @id @default(autoincrement())
  createdAt      DateTime @default(now()) @map("created_at")
  updatedAt      DateTime @updatedAt @map("updated_at")
  email          String   @unique
  hashedPassword String
}

prisma/schema.prismaが生成されているので、適当なスキーマ設定を追記する。

npx prisma migrate dev --name init

マイグレーションを実行する。

もし失敗する場合は下記が参考になるかも。

【Prisma】migrate devが「Can't reach database server」とエラーになる

4-3. スキーマの確認

npx prisma studio

Prisma Studioを起動しlocalhost:5555にアクセスする。

Userテーブルを確認し、先ほどschema.prismaに追記したスキーマが反映されていればOK。

4-4. Prisma Clientの生成

npx prisma generate

MySQLを使う場合

docker-compose.yml

  db:
    container_name: db-container
    image: postgres:15
    platform: linux/amd64
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pw
      TZ: 'Asia/Tokyo'
    ports:
      - '5432:5432'
    container_name: db-container
    image: mysql:5.7
    platform: linux/amd64
    environment:
      MYSQL_DATABASE: mydb
      MYSQL_USER: user
      MYSQL_PASSWORD: pw
      TZ: 'Asia/Tokyo'
    ports:
      - '3306:3306'

.env

DATABASE_URL="postgresql://user:pw@db:5432/mydb"
DATABASE_URL="mysql://user:pw@db:3306/mydb"

schema.prisma

datasource db {
  provider = "postgresql"
  provider = "mysql"
  url      = env("DATABASE_URL")
}

加えて、MySQLだとマイグレーション時に下記のように権限を付与する必要がある。

【Prisma】migrate devが「could not create the shadow database」とエラーになる