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 --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:dev
localhost: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 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」とエラーになる