Next.jsのstandaloneビルドでsharpが認識されないときはこうしよう
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
を行っても、このエラーが出続けるようになりました。
幸いエラーは出るもののちゃんと動いてはいるっぽいのですが、ログが邪魔だし、いつエラーが顕在化するかもわからないので、対処します。
対処法
こちらのdiscussionsで対処法が投稿されてました。
sharpのバージョンを 0.32.6
に変更することで対処できるようです。
というのが追記前の内容で、更にいろいろ調べたところ、これはalpine linuxをDockerのベースイメージに設定している際に起こることがわかりました。
こちらがIssueで、sharp 0.33ではDocker環境でalpineを使っていると、バイナリが出ないというバグが報告されています。
こちらについては、standaloneビルドを行う際のバンドルに使用されている @vercel/nft
のバグだそうで、以下のIssueで修正されています。
なので、もしもsharpの最新版を利用したい場合は
- Alpine Linuxをやめる
-
@vercel/nft
を最新にする
で対処できます。
Discussion