0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Next.js × PrismaをDockerコンテナ内で動かしたらMySQLに接続できなかった話

Posted at

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コンテナで起動させていたMySQLAPIから接続しようとしたが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のバイナリ生成設定をまず疑うとスムーズだと学びました。

参考になれば嬉しいです!🙌

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?