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_URL
をpostgresql://<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」とエラーになる