npx prisma migrate:dev でエラーが発生する


こんにちは、株式会社プラハのエンジニアの粟田です。

先日仕事中に突然 npx prisma migrate:devが失敗するようになったので、その原因と対策について備忘として残しておこうと思います。

エラーが発生した環境

  • MacOS(M1)
  • Docker for Desktop(Apple Silicon用)
  • PostgreSQL 14(Docker上で起動)
  • Prisma 3.7

エラーの内容

npx prisma migrate:dev

ある日突然、これまでずっと成功していた上記のコマンドを実行すると

Prisma Migrate could not create the shadow database. 
Please make sure the database user has permission to create databases.  
More info: https://pris.ly/d/migrate-shadow

Original error:
db error: ERROR: could not create file "base/103384/3764": Permission denied
   0: migration_core::state::DevDiagnostic
             at migration-engine/core/src/state.rs:248

こんなエラーが起きるようになってしまいました。
(読みやすいように改行入れたりしてるので、原文とは若干違います)

エラーの原因を考える

まずはエラー文に出力されている公式サイトを確認してみます。

The user must be a super user or have CREATEDB privilege. See CREATE ROLE (PostgreSQL official documentation)

どうやらPostgreSQLの場合は、CREATEDB権限を持っているかSUPERUSERじゃないと実行できないらしい。

ということで、psqlを使って権限を確認してみると

                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 root      | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

うーん、どうやら権限が不足している訳ではないらしい。
そもそもエラーの内容的に、ファイルを作る権限がないという内容なので、やはりここは問題なさそうです。

これまでずっと動いていたのものが突然動かなくなったので、環境依存系のエラーかなーとは思っていたので、最近何かやったか?と思い返してみると、、、

しっかりその日の朝にDockerの環境変更をやってました。
同僚のtimesチャンネルにこちらの記事が流れていたのを読んで、早くなるのか!じゃあやってみよ!くらいの軽いノリで、以下のように設定していました。

もしかしてこれが原因か、、、?と思いながら、チェックを外してみると、ちゃんと動き始めました。

まとめ

なぜDockerの環境を変更したことでエラーが起きるようになったのか、はっきりとした原因は分かりませんでした。
もし分かる方がいればぜひコメントで教えていただけると助かります!