Fastify Docker

  • ビルド
  • 実行
  • ホットリロード
  • デバッグ
  • Prisma

バージョン

Node.js 18.12.0
npm 9.6.6
docker 23.0.5
docker-compose 2.17.3
fastify 4.17.0
typescript 5.0.4

説明

  • デバッグ用にポート番号を揃える必要がある箇所
    • .vscode/launch.json に指定する port 番号
    • package.jsonstart:dev に指定する --inspect=0.0.0.0:ポート番号 のポート番号
    • docker-compose.yml に指定する ports のポート番号
  • プロジェクトの Hot Reload 対応をしたため、node_modules を volume 指定したので以下に注意する
    • 新しいパッケージをインストールしたり、削除したりするときは volume を削除し、イメージを再ビルドする
    • prisma のモデル、テーブル構造を変更した際、volume を削除する

コマンド

Prisma

  • 初期化
    • npx prisma init
  • Prisma Schema から Prisma Client コードを生成する
    • npx prisma generate
    • node_modules/@prisma/client に置かれる
  • スキーマのマイグレーション用の sql を生成する
    • npx prisma migrate dev --name マイグレーション名 --preview-feature
  • npx prisma migrate dev のオプション
    • --create-only
      • マイグレーション用の SQL 文だけ生成する
      • DB には適用しない
      • 生成された文を自分でカスタマイズすることも可能
    • --preview-feature
      • 実行時にどういうことをするかをコンソール上に表示してくれる
    • --name <stage name>
      • マイグレーション名を指定できる
      • マイグレーション内容の説明を入れたりするのに使う
  • ローカル環境の DB を GUI 操作するためのツールを起動する
    • npx prisma studio

マイグレーションケースによるコマンド

  • 開発環境でマイグレーションを生成して適用する
    • npx prisma migrate dev
    • 本番環境では使ってはいけない
  • 開発環境の DB を再設定する
    • npx prisma migrate reset
    • 本番環境では使ってはいけない
  • マイグレーション用の SQL 文だけを生成する
    • npx prisma migrate dev --create-only
    • SQL 文を適用させるには npx prisma migrate dev を実行
  • マイグレーションファイルを生成せず、DB のテーブルに変更を加える
    • npx prisma db push
    • 開発用コマンド
    • 開発中の試行錯誤で使う
    • DB への反映と Prisma Client の更新を行う
    • 意図した DB のスキーマになったら npx migrate dev でマイグレーションファイルを生成する
  • 本番・STG 環境でマイグレーションを適用する
    • npx prisma migrate deploy

エラーと解決

Prisma Migrate could not create the shadow database. Please make sure the database user has permission to create databases.

  • npx prisma migrate dev でマイグレーション用の SQL 文を生成・適用させようとした際に発生

  • 原因

    • npx prisma migrate dev を実行すると shadow database と呼ばれる一時的なデータベースがマイグレーションのために作成される
    • しかし、shadow database を作成する権限がない場合、マイグレーションが実行できないので失敗してエラーメッセージが表示される
  • 対応

    • Prisma 公式のAbout the shadow databaseをもとに、mysql の場合の書き方をした SQL 文を設ける

      • grant all CREATE, ALTER, DROP, REFERENCES ON *.* to MYSQL_USER@'%';
    • さらに Docker で 最初に MySQL を起動した際に自動的に設定の初期化をするように、設定をする

      • db/init/init.sql を設けて、対応用の SQL を書き込む
      • docker-compose.ymlvolume./db/init 配下を /docker-entrypoint-initdb.d 配下におくように設定する

Can't reach database server at xxxx

  • 原因
    • prisma 接続先の DATABASE_URL で db コンテナを localhost で指定していた
    • docker-compose によって app コンテナと db コンテナが立っている状態のため、app コンテナから見た localhost は app コンテナということになる
  • 対応
    • docker-compose.yml で定義したサービス名の db を使って指定する
    • docker-compose.yml で network を指定しなくてもデフォルトで同一ネットワークに属していることになる

参考

setting

hot reload

debug inspector

Prisma 設定

docker