🤯

Next.jsのstandaloneビルドでsharpが認識されないときはこうしよう

2024/07/04に公開

TL;DR

  • Next.jsのstandaloneモードだと、画像処理ライブラリの sharp が必須
  • Dockerのイメージに node:alpine を使用していると、sharpが正常にバンドルされないことがある
  • alpineを使うのをやめるか、sharpのバージョンを 0.32.6 にするか、@vercel/nft を最新にすると解決できる

何が起こったのか

私が管理してるサービスのDocker Imageが、.nextだけで3GBくらいあって、どうにか減らせないかなと考えた時に、Next.jsのoutput設定にstandaloneというのがあることを知りました。

これはNext.jsの機能で、プロダクションビルド向けに、必要なファイルだけをいい感じにバンドルしてくれる機能だそうで、これで結果、Docker Image容量を300MBくらいまで減らすことができました。

しかしながら、テスト環境にデプロイしてみたところ、以下のようなエラーが出るようになりました。

2024-07-04T00:29:08.8539481Z  ??? Error: 'sharp' is required to be installed in standalone mode for the image optimization to function correctly. Read more at: https://nextjs.org/docs/messages/sharp-missing-in-production
2024-07-04T00:30:13.0533388Z  ??? Error: 'sharp' is required to be installed in standalone mode for the image optimization to function correctly. Read more at: https://nextjs.org/docs/messages/sharp-missing-in-production
2024-07-04T00:30:13.1026891Z  ??? Error: 'sharp' is required to be installed in standalone mode for the image optimization to function correctly. Read more at: https://nextjs.org/docs/messages/sharp-missing-in-production
2024-07-04T00:30:13.1758892Z  ??? Error: 'sharp' is required to be installed in standalone mode for the image optimization to function correctly. Read more at: https://nextjs.org/docs/messages/sharp-missing-in-production
2024-07-04T00:30:36.2317598Z  ??? Error: 'sharp' is required to be installed in standalone mode for the image optimization to function correctly. Read more at: https://nextjs.org/docs/messages/sharp-missing-in-production

ざっくりいうと、「standalone modeだとsharpが必要だから入れろや」ということなんですが、公式ドキュメントに従って、pnpm add sharp を行っても、このエラーが出続けるようになりました。

幸いエラーは出るもののちゃんと動いてはいるっぽいのですが、ログが邪魔だし、いつエラーが顕在化するかもわからないので、対処します。

対処法

https://github.com/vercel/next.js/discussions/59460#discussioncomment-8062593

こちらのdiscussionsで対処法が投稿されてました。
sharpのバージョンを 0.32.6 に変更することで対処できるようです。

というのが追記前の内容で、更にいろいろ調べたところ、これはalpine linuxをDockerのベースイメージに設定している際に起こることがわかりました。

https://github.com/lovell/sharp/issues/3900

こちらがIssueで、sharp 0.33ではDocker環境でalpineを使っていると、バイナリが出ないというバグが報告されています。

こちらについては、standaloneビルドを行う際のバンドルに使用されている @vercel/nft のバグだそうで、以下のIssueで修正されています。

https://github.com/vercel/nft/issues/371

なので、もしもsharpの最新版を利用したい場合は

  1. Alpine Linuxをやめる
  2. @vercel/nft を最新にする

で対処できます。

Discussion