Buri Memo:

アイデアや気づきとかが雑に書き殴られる

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

ミニPC vs 埃ラズパイ
ミニPC vs 埃ラズパイ
最近ミニPCを買いました。趣味で CPUをそこそこ使う処理を一日中動かしたいなぁという状況になったのですが VPS だと費用がバカにならないので自宅サーバーとして手頃なミニPCにしてみました。

TRIGKEY 製の安価な物で、CPUコアが8個もついてるのにこの大きさでこのお値段。消費電力も 5~40w 位と今の所はなかなかいい感じ(1ヶ月辺り千円くらい)。まだ触り初めて数日だけど。

届いて諸々の準備を済ませてウキウキと docker build (docker-compose build)を実行してみたところ、RUN npm ci でハングしました。メインのPCや VPS 上だと問題なかったのに!

風呂に入りながら数分間放置してみると以下のようなエラーが出ていました。

ARG image=node:20-slim

FROM ${image} AS dev

USER root

WORKDIR /common
COPY ./common/ /common/
RUN npm ci
RUN npx tsc

# 以下省略
 > [simulator dev 10/14] RUN npm ci:
360.1 npm ERR! code ETIMEDOUT
360.1 npm ERR! syscall read
360.1 npm ERR! errno -110
360.1 npm ERR! network read ETIMEDOUT
360.1 npm ERR! network This is a problem related to network connectivity.
360.1 npm ERR! network In most cases you are behind a proxy or have bad network settings.
360.1 npm ERR! network
360.1 npm ERR! network If you are behind a proxy, please make sure that the
360.1 npm ERR! network 'proxy' config is set properly.  See: 'npm help config'
360.1
360.1 npm ERR! A complete log of this run can be found in: /root/.npm/_logs/2023-12-05T16_16_40_516Z-debug-0.log
------
failed to solve: process "/bin/sh -c npm ci" did not complete successfully: exit code: 146

解決

1. network=host にする(解決したと思ったら再発)

docker build --network=host . のように RUN の実行を host ネットワークモードを使うように指定するとうまく行きました。docker-compose の場合は build の network を設定するだけ。

version: "3.8"

services:
    app:
        build:
            dockerfile: Dockerfile
            context: .
            network: host

2. npm v10 以上(Node v20以上)の場合: v10.5.1 以上に上げる(解決🎉)

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

$ npm install -g npm@latest

マイナーバージョンの変化ですがなにか理由があってバージョンアップしたくない場合は v9 以下に下げるのも有効みたいです。

github.com

参考