NestJS × Prisma × PostgreSQL × Dockerで開発環境構築
タイトルの構成で、最低限開発が進められるところまでの環境構築をする。
環境構築手順
1. Dockerの設定
mkdir <PROJECT_NAME>touch Dockerfile docker-compose.yml .dockerignore1-1. Dockerfile
FROM node:18.14.1-alpine
WORKDIR /app
RUN npm i -g @nestjs/cli1-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_modules1-4. ビルド
docker compose up -d --builddocker 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:devlocalhost:3000にアクセスしてHello World!が表示されればアプリ側はOK。
FROM node:18.14.1-alpine
WORKDIR /app
RUN npm i -g @nestjs/cliCOPY ./package.json .COPY ./package-lock.json .RUN npm installCMD [ "npm", "run", "start:dev"]以後は各種npmパッケージのインストールと開発環境立ち上げをコンテナ起動時に行いたいので、Dockerfileに追記しておく。
4. Prisma
4-1. 導入
npm i prisma @prisma/clientnpx prisma initDATABASE_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 studioPrisma Studioを起動しlocalhost:5555にアクセスする。
Userテーブルを確認し、先ほどschema.prismaに追記したスキーマが反映されていればOK。
4-4. Prisma Clientの生成
npx prisma generateMySQLを使う場合
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」とエラーになる