1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[エラー対応] Docker環境でPrisma migrate実行時にERR_REQUIRE_ESMが出た原因と解決方法

1
Posted at

はじめに

Docker の学習で Prisma を使ってデータベースに登録しようとした際、Docker 環境でマイグレーションを実行するとエラーが発生しました。
解決まで少し詰まってしまったので、備忘録として残します。

実行したコマンド

API コンテナ内で Prisma のマイグレーションを実行しようとして、以下のコマンドを使いました。

docker compose exec api npx prisma migrate dev

エラーメッセージ

Error [ERR_REQUIRE_ESM]: require() of ES Module /app/node_modules/zeptomatch/dist/index.js from /app/node_modules/@prisma/dev/dist/state.cjs not supported.
Instead change the require of index.js in /app/node_modules/@prisma/dev/dist/state.cjs to a dynamic import() which is available in all CommonJS modules.
    at Object.<anonymous> (/app/node_modules/@prisma/dev/dist/state.cjs:1:2235)
    at Object.<anonymous> (/app/node_modules/prisma/build/index.js:4649:60) {
  code: 'ERR_REQUIRE_ESM'
}

エラーメッセージの意味

このエラーは、モジュールの読み込み方式の違いが原因で発生しています。
Node.js には主に2つのモジュール方式があります。

  • CommonJS(require)
  • ES Modules(import)

今回のエラーは、require()(CommonJS)でES Module(ESM)形式のファイルを読み込もうとしたときに発生するエラーです。

Prisma 7 では内部で ES Modules が使用されているため、
Node.js のバージョンによってはこのような不整合が発生する場合があります。

修正前のファイル

API コンテナの Node.js バージョンは以下のようになっていました。

todo-api/Dockerfile
FROM node:18-alpine

WORKDIR /app

COPY . .

RUN npm install

EXPOSE 3000

CMD ["npm", "run", "dev"] 

また、package.json では Prisma 7 系を使用していました。

todo-api/package.json
{
  "name": "todo-api",
  "type": "module",
  "scripts": {
    "dev": "tsx watch src/index.ts",
    "build": "tsc",
    "start": "node dist/index.js"
  },
  "dependencies": {
    "@hono/node-server": "^1.19.13",
    "@prisma/client": "^7.8.0",
    "hono": "^4.12.12"
  },
  "devDependencies": {
    "@types/node": "^20.11.17",
    "prisma": "^7.8.0",
    "tsx": "^4.7.1",
    "typescript": "^5.8.3"
  }
}

エラーの原因

今回の原因は、Prisma 7 と Node.js 18 の組み合わせによる実行環境の不整合でした。

Prisma 7 では内部で ES Module(ESM)形式のライブラリが使用されていますが、
Node.js 18 では Prisma 7 が前提としている実行環境を満たしていないため、
モジュールの読み込み時に不整合が発生します。

また、Prisma 7 の公式要件では Node.js は以下が必要です。

Node.js ^20.19.0 以上

そのため、Node.js 18 の環境で npx prisma migrate dev を実行すると、
モジュールの読み込み方式の不一致が発生し、今回のエラーにつながりました。

解決方法

todo-api/DockerfileのNode.js バージョンを20系に変更しました。

todo-api/DockerFile
FROM node:20-alpine

WORKDIR /app

COPY . .

RUN npm install

EXPOSE 3000

CMD ["npm", "run", "dev"] 

その後、イメージを再ビルドしてコンテナを起動し直し、
再度マイグレーションを実行しました。

docker compose build api
docker compose up -d
docker compose exec api npx prisma migrate dev

これでエラーを解消できました。

終わりに

今回のエラーは、Prisma と Node.js のバージョンの組み合わせによる実行環境の不整合が原因でした。
今回の対応を通して、

  • ライブラリのバージョン
  • 実行環境(Node.js など)のバージョン

の両方を確認することの重要性を学びました。

参考資料

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?