Docker内でのnpm installがECONNREFUSEDエラーになる現象への対処法（M1Mac）

# はじめに
ハッカソンに参加した際に、1人だけ環境構築に手こずったので、対処法を記録しておきます。自分の備忘録になるついでに、同じエラーで困っているという方の助けになりますように。

# エラーのログ
docker内で`npm install`を実行すると以下のようなエラーが出ます。
```
npm ERR! code ECONNREFUSED
npm ERR! errno ECONNREFUSED
npm ERR! FetchError: request to http://registry.npmjs.org/@testing-library%2fjest-dom failed, reason: 
npm ERR!     at ClientRequest.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/minipass-fetch/lib/index.js:130:14)
npm ERR!     at ClientRequest.emit (node:events:519:28)
npm ERR!     at _destroy (node:_http_client:880:13)
npm ERR!     at onSocketNT (node:_http_client:900:5)
npm ERR!     at process.processTicksAndRejections (node:internal/process/task_queues:83:21)
npm ERR!  FetchError: request to http://registry.npmjs.org/@testing-library%2fjest-dom failed, reason: 
npm ERR!     at ClientRequest.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/minipass-fetch/lib/index.js:130:14)
npm ERR!     at ClientRequest.emit (node:events:519:28)
npm ERR!     at _destroy (node:_http_client:880:13)
npm ERR!     at onSocketNT (node:_http_client:900:5)
npm ERR!     at process.processTicksAndRejections (node:internal/process/task_queues:83:21) {
npm ERR!   code: 'ECONNREFUSED',
npm ERR!   errno: 'ECONNREFUSED',
npm ERR!   type: 'system',
npm ERR!   requiredBy: '.'
npm ERR! }
npm ERR! 
npm ERR! If you are behind a proxy, please make sure that the
npm ERR! 'proxy' config is set properly.  See: 'npm help config'

npm ERR! A complete log of this run can be found in: /root/.npm/_logs/2024-03-10T06_07_18_666Z-debug-0.log
```

# 環境
- M1 Mac
- Docker version: 20.10.23

Docker内の環境は以下の通りです。
- node: v21.7.0
- npm: v10.5.0

# 解決方法
ローカル環境のnodeのバージョンをdocker内のバージョンに合わせて、作業フォルダ内で`npm install`を行った後、コンテナの中に入って`npm install`を行うことで解決しました。
## 手順
1. docker内のnodeのバージョンを確認
    ```
    # node -v
    v21.7.0
    ```
    <br>
2. ローカル環境のnodeのバージョンをdockerのnodeのバージョンと揃える
    ```
    $ nodebrew install v21.7.0
    $ nodebrew use 21.7.0
    ```
    <br>
3. 作業フォルダに移動してnpm installを実行する
    ```
    $ cd hoge
    $ npm install
    ```
    この時に、作業フォルダ内にnode_modulesという名前のフォルダが作成されます。
    <br>
4. docker内に入り、npm installを行う
    ```
    # npm install
    ```
    エラーが出なければ、このまま`npm start`でreactの画面が立ち上がると思います。
<br>
nodebrewについての詳しい解説はこちら↓

https://fromscratch-y.work/blog/programming/mac-nodejs-install/

# 他にも！色々試した対処法
色々試してみた方法をまとめておきます。
上記の解決方法でうまくいかない場合に参考になればと思います。

## IPv6からIPv4に変更する
```
$ export NODE_OPTIONS=" --dns-result-order=ipv4first "
```
を実行した後、`npm install` を行う。

私の環境では以下のようなエラーが発生してしまいました。
```
npm ERR! code ETIMEDOUT
npm ERR! errno ETIMEDOUT
npm ERR! network request to http://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz failed, reason: 
npm ERR! network This is a problem related to network connectivity.
npm ERR! network In most cases you are behind a proxy or have bad network settings.
npm ERR! network 
npm ERR! network If you are behind a proxy, please make sure that the
npm ERR! network 'proxy' config is set properly.  See: 'npm help config'

npm ERR! A complete log of this run can be found in: /root/.npm/_logs/2024-03-10T09_22_23_795Z-debug-0.log
```

参考になりそうなURLも貼っておきます。

https://qiita.com/T_death/items/251b2c08be4744d03dc8

## 他の人からpackage.jsonをもらってきて`npm ci`する方法
私の場合はこちらの方法でも同じエラーが出ました。
参考になりそうなURLを添付しておきます。

https://blog.minimalcorp.com/users/jigen/posts/6f325dc9b8a00370b6aedf47a34cb3ce

## proxyとhttps-proxyを正しく設定し直す方法
私の場合は特に組織に属しているわけではないので、proxyとhttps-proxyがnullであることを確認したり、初期化処理を行ったりしていました。

- proxy環境下ではない方用の参考になりそうなサイト

https://qiita.com/Coa3/questions/270b3f0eee14d7a8714f

`npm config list`を実行して、`proxy`または`https-proxy`に変な値が登録されていないか確認されてみると解決するかもしれません。

- proxy環境下で開発を行なっている方用の参考になりそうなサイト
こちらは私の環境とは異なるので、参考になりそうなURLだけ載せておきます。

https://qiita.com/tenten0213/items/7ca15ce8b54acc3b5719