どおおおおもおおおお
受諾案件で掲題のことをして地獄を見ましたyagrushです
引き継いだのは、nodeにgulpやらbabelやらonsen-uiやら大量にインポートしたサーバーアプリケーション。
これ、いままでvagrantで動いてたらしいんだけど、docker化せねばならない。
しかもマルチOS(Windows, Mac, Linux)で。
現状
- ルートディレクトリに package.json は残っていました。
- /node_modules はありませんでした。
package.json をたよりに npm install してみんとす
- Mac ... 奇跡的に動いた。
Linux ... 奇跡的に動いた。
Windows ...
npm ERR! code ENOENT
npm ERR! syscall open
npm ERR! path /xxxxxxxxxxx/xxxxxxxxxxx/xxxxxxxxxxx
npm ERR! errno -2
npm ERR! enoent ENOENT: no such file or directory, open '/xxxxxxxxxxx/xxxxxxxxxxx/xxxxxxxxxxx'
...
npm ERR! Maximum call stack size exceeded
"Failed to load external module @babel/register"
これらのエラーが途中で無秩序に発生します・・・
なおコマンドインターフェース上のプログレス表示の傾向としては、
- 最初は快速にnpm installが進行していきますが、
- だんだん遅くなり、
- やがて永眠します…
上記3種のエラーが出て止まればまだマシな方で、最悪、Docker Desktopがハングアップします…
トライアンド全部エラー
ネット上には、同様に犠牲となった多数の猛者たちの夢の跡が散見されるのですが、
- npm install --no-bin-links ← すでにやっとるがな!
- rm -f package-lock.json ← すでにやっとるがな!!
- docker desktopの性能設定を上げる
- npm cache clean --force
- .npmignore を作る
- npm rebuild
- npm config set registry http://registry.npmjs.org/
- package.jsonをすべて手書きのnpm installにする
ええ、全部やってみましたとも
対処方法
よかろう!!
貴様がその気なら、こちらにも考えがあるわ!!!
というわけで、超スーパー泥臭対応で解決しました。
- docker-nodeコンテナのワークディレクトリをdocker-compose.ymlなどでvolumeマウントしておく。
- 何度もnpm installする。
- コケてもハングアップしても /node_modules は絶対削除せずに、何度もリトライ。
- npm installコマンドは、/node_modules にすでにあるものを飛ばして次のモジュールをインストールする。
- やがて、/node_modules が完成された姿として満たされていく・・・!
- そしてあなたは、ついに暁の空を目撃するであろう。(npm installを完遂したことになり次の処理に移れる)
- 血と汗とともに完成した /node_modules を(volumeマウント経由でdockerコンテナから確保し、)/windows_node_modules などとして大事に大事に「よしよしいい子だ~」と言って秘蔵しておく。
- ビルドスクリプトを修正し、次回からは npm install を実行させるのではなく、/windows_node_modules を
cp -R windows_node_modules node_modules
で済ませるようにする。
あとがき
はーマジ鬼門だわ
現象から想像するに、Windows * (npm on Docker) 固有の問題なのかねぇ…。
今度余裕あればnpmじゃなくてyarnで試してみようかな
(意外と動いたりしそうで怖い)