はじめに
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 バージョンは以下のようになっていました。
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN npm install
EXPOSE 3000
CMD ["npm", "run", "dev"]
また、package.json では Prisma 7 系を使用していました。
{
"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系に変更しました。
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 など)のバージョン
の両方を確認することの重要性を学びました。
参考資料