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

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

環境構築手順

1. Dockerの設定

Terminal window
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. ビルド

Terminal window
docker compose up -d --build
docker compose ps

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

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

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

2. コンテナに入る

Terminal window
docker exec -it app-container sh

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

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

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

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

Terminal window
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. 導入

Terminal window
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が生成されているので、適当なスキーマ設定を追記する。

Terminal window
npx prisma migrate dev --name init

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

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

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

4-3. スキーマの確認

Terminal window
npx prisma studio

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

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

4-4. Prisma Clientの生成

Terminal window
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」とエラーになる

12

参考
  1. Dockerを利用してNestJS+Prisma+MySQLの環境構築をしてテーブル作成をしてみる - Qiita

  2. GraphQL, Fastify, Nest, Prisma, MySQL, Docker環境をサクッと構築する - Zenn