Macのdocker上で npm install すると固まったり、エラーで失敗する

2024-04-27  /  開発環境NodeDocker

解決するのに1日溶かしてしまったので備忘録。

解決策

npmのバージョンが 10.5.0 の場合 10.5.1 以上にバージョンアップする

です。

npm installがうまく行かない

Macで docker build を実行した際に、Dockerfile の中で指定した RUN npm install で処理が固まってしまうことが起きていました。

dockerdが固まる?

ビルドが固まった状態になってしまうと、qemu-system-aarch64 というプロセスのCPU使用率が100%に張り付いてしまい、他の docker ps などのコマンドも実行できなくなっていました。こうなると dockerd を再起動しないといけないらしく、Rancher Desktopを再起動する必要がありました。

ネットワークのエラーになる

また辛抱強く待ってみても、以下のようなエラーが起きるようになっていました。

 => ERROR [4/4] RUN npm install                                                                                                                                                                                                                                                           350.1s
------
 > [4/4] RUN npm install:
271.2 npm WARN deprecated [email protected]: Use your platform's native DOMException instead
345.0 npm ERR! code ETIMEDOUT
345.0 npm ERR! syscall read
345.0 npm ERR! errno -110
345.0 npm ERR! network read ETIMEDOUT
345.0 npm ERR! network This is a problem related to network connectivity.
345.0 npm ERR! network In most cases you are behind a proxy or have bad network settings.
345.0 npm ERR! network
345.0 npm ERR! network If you are behind a proxy, please make sure that the
345.0 npm ERR! network 'proxy' config is set properly.  See: 'npm help config'
345.5
345.5 npm ERR! A complete log of this run can be found in: /root/.npm/_logs/2024-04-24T07_42_03_445Z-debug-0.log
------
Dockerfile:20
--------------------
  18 |
  19 |     # RUN echo "progress = false" >> /app/.npmrc
  20 | >>> RUN npm install
  21 |
  22 |     # RUN npm run build
--------------------
ERROR: failed to solve: process "/bin/sh -c npm install" did not complete successfully: exit code: 146

エラーメッセージの通りだと何かネットワークの問題があるようなので、dockerの方に何か原因があるのだろうと調べていましたが、解決の糸口になることはありませんでした。

少数のパッケージだと上手く行く

やりたかったことはReactのアプリをビルドしたかったのですが、試しに1つだけパッケージをインストールするような package.jsonを使用したところ問題ありませんでした。

エラーメッセージでググって解決

npm install の方に問題があるのかもと思い、エラーメッセージで検索したところ、以下のページを発見しました。

Node.js v20のnpm ciが進まなくなりnetwork read ETIMEDOUT が出た - Buri Memo:

GitHub 上に以下のような issue を見つけました。この issue によると npm install 時に大量のコネクションを確立してしまう結果、ネットワークの問題で停止するとのことでした。npm v10.5.1で解消されたらしいので最新までバージョンを上げることで解消しました。

問題となっていたissue はこちら。

[BUG] Npm opens many connections when installing

まさにこれでは!!!と思って試したところ問題なくビルドできるようになりました。

RUN npm install -g npm@latest
RUN npm install

これで問題ありませんでした。

教訓

ビルドなどでうまく行かない、しかもネットワークに問題がある、という時は大抵環境の問題かなと思ってしまうのですが、ツールにも問題があることがあるんだなと。

今まであまりパッケージマネージャーの細かいバージョンを気にしたことが無かったので、そこも注意してみようと思いました。