Next.js でDockerを使用して本番環境用にイメージを作成すると、BUILD_IDがない、もしくはsever.jsがないといわれる場合の対処法です。
エラー
[Error: ENOENT: no such file or directory, open '/app/.next/BUILD_ID'] {
errno: -2,
code: 'ENOENT',
syscall: 'open',
path: '/app/.next/BUILD_ID'
}
Dockerの起動時に、Dockerfileに以下のどちらかで書いてる場合に上記のエラーとなります。
CMD ["yarn", "start"]
or
CMD ["node", "server.js"]
対処
これは、.nextディレクトリが起動時に存在しないため起こります。
先にbuildすると、.nextディレクトリが作成されて、BUILD_IDとserver.jsが作成されます。
なので、先にbuildしてから、startします。
CMD sh -c "yarn build && yarn start"
CMD sh -c "yarn build && node .next/standalone/server.js"
next.config.jsの設定
以下の追記が必要です
- output: 'standalone' ← standaloneモードにする場合
- BUILD_IDをユニークにしたい場合
module.exports = {
output: 'standalone',
reactStrictMode: true,
generateBuildId: async () => {
// ここは色々方法はある
return process.env.VERSION || Date.now() + Math.round(Math.random() * 2441139);
},
}
補足
- エラーの表示メッセージがおかしいと話題になってます
このバージョンで試したらエラーにはなりますが、メッセージは分かりやすいです。
https://github.com/vercel/next.js/pull/62404 - Dockerfileはここを参照
https://github.com/vercel/next.js/blob/canary/examples/with-docker/Dockerfile - Deploy 本家のドキュメント
https://nextjs.org/docs/pages/building-your-application/deploying