Docker環境でNext.jsからprismaでMySQLに接続しようとしたときめちゃくちゃハマったので自分の備忘も兼ねて記事にしました。
動作環境
- Mac Apple M1 Pro
- Next.js 15.1.4
- Prisma 6.3.0
- MySQL 8.0
問題の発生状況
- Next.js(Prisma使用)をDockerコンテナ内で起動し、同じくDockerコンテナで起動させていたMySQLにAPIから接続しようとしたが500エラー、原因はMySQLへの接続失敗によるものでした
- 一方、Next.jsをローカル(MacOS上)で起動し、localhost経由でMySQLに接続すると正常に接続できた
確認したこと・試したこと
-
.env
ファイルに設定したDATABASE_URL
を参照しているか確認→問題なし -
コンテナのログにPrismaのエラーが出ているか確認→気になるエラーを発見
-
エラー内容は以下
Prisma Client could not locate the Query Engine for runtime "linux-musl-arm64-openssl-3.0.x". This happened because Prisma Client was generated for "darwin", but the actual deployment required "linux-musl-arm64-openssl-3.0.x".
要するに、Prisma Clientが、darwin(MacOS)用に生成されているのに対し、Dockerコンテナ内はLinux環境のため接続できない。
だから、local環境(MacOS)からの接続はうまく行っていたのか、なるほど...
解決策
prismaをlinux環境で動作できるように修正する。
1. schema.prisma
の修正
```
generator client {
provider = "prisma-client-js"
binaryTargets = ["native", "linux-musl-arm64-openssl-3.0.x"] //追加
}
```
- prisma clientをlinux用のバイナリで生成される設定を追加
2. Prisma Clientの再生成
```
docker-compose exec コンテナ名 npx prisma generate
```
3. コンテナの再起動
```
docker-compose restart コンテナ名
```
まとめ
Docker環境でPrismaを使う場合、
binaryTargetsの設定を忘れると環境差異でエラーが出るので要注意です!
特に「ローカルでは動くのに本番やコンテナで動かない」現象は、
Prisma Clientのバイナリ生成設定をまず疑うとスムーズだと学びました。
参考になれば嬉しいです!🙌