0
0

Docker環境で"The engine "node" is incompatible with this module. Expected version ~"のエラーを解消する

Posted at

初心者です。Docker+Rails6+Nuxt.jsで認証機能付きのポートフォリオサイトを作ろうとしていたある日のことです。
Nuxt.jsアプリを動かすためのDockerimageが突然ビルドできなくなり、以下のようなエラーがコンソールに出力されていました。
初心者なのでエラー文と仲良くする習慣づけのために備忘録残しておきます。
(それにしても急に出たのはなんでだろう、タイミングよくサポートするバージョンが変わったんだろうか)

エラー文

動いてた時代のDockerFileのままdocker buildしてみたらこんなエラーが出ました。

126.4 error cssnano@7.0.3: The engine "node" is incompatible with this module. Expected version "^18.12.0 || ^20.9.0 || >=22.0". Got "16.13.1"
126.5 error Found incompatible module.
126.5 info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.

nodeのバージョンが悪いって言われてる...?今まで文句言わなかったくせに...

環境情報

環境はこんな感じ

OS:MacOS 14.1.1(Sonoma)

DockerFileにはこんな感じでAlpineベースのnodeを指定していました。

FROM node:16.13.1-alpine

念の為dockerコンテナ上のnodeのバージョンを確認

$ docker-compose run --rm front node -v
v16.13.1

当たり前に自分が指定したバージョンで動いてました。怖いからやりたくないけど言われた通りにnodeのバージョン上げるしかないのね

バージョンアップ先のnodeを決めよう

Expected version "^18.12.0 || ^20.9.0 || >=22.0". Got "16.13.1"

お前は16.13.1とかいう古いバージョン使いすぎてるから最低でも18.12.0とかにしなさいよ、ということか。
素直なので一番今のバージョンに近い18.12.0にしてみることにする。

ちなみにNode.jsの16系のサポートは2023年にとっくに切れていた。なんで環境構築初期は動いてたんだろう。わかりません

Node.jsのリリースノート
image.png

nodeの新しいイメージのタグを探しに行く

DockerFileで指定するベースイメージとなるnodeのタグを探しに行く。
指定する用のタグはdockerhubで確認できる。

こんな感じで欲しいバージョンのタグを探せる。
image.png

自分は今回AlpineLinuxのイメージを使うことに。
お目当てのタグを控えます>18.12.0-alpine
image.png

ところでAlpineLinuxって何?

非常に軽量なLinuxディストリビューションの一つで、muslとBusyBoxがベースのなっている。
libcに一般的な互換性が不足している等欠点もあるので、導入時は気をつけたい、けどDockerイメージの軽量化に役立つので今回の勉強用の開発環境にはちょうど良かったです。

DockerFileを修正しよう

今まで指定していた古いバージョンの記載を消して、dockerhubから連れてきた新しいバージョンを指定してやります。

#FROM node:16.13.1-alpine //コメントアウト
FROM node:18.12.0-alpine  //新規追加

ビルドし直してみる!

DockerFileで指定した新しいNodeのバージョンでビルドし直してみる。

$ docker-compose build
[+] Building 467.9s (24/24) FINISHED

せ、成功だ〜〜〜〜〜〜〜!!!!!!!

結論

普通にエラー文読もう

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