ユーニックス総合研究所

  • home
  • archives
  • npm-io-error

npm installでi/o error【Windows, Docker, Webpack】

  • 作成日: 2023-04-19
  • 更新日: 2023-12-24
  • カテゴリ: JavaScript

npm installでi/o errorが発生

以下の環境のnpmでi/o errorが発生した。

  • Windows
  • Windows用のDocker
  • Webpack
  • Django

Windows機とDjangoで開発していて、Windows用のDockerを起動。
DockerのコンテナにWindowsからログインして、その中でnpm run watchを実行。
npm run watchwebpack --watchを実行するコマンドにしている。

最初はDjangoのpython manage.py runserverでエラーを検出していた。
なんでもこのコマンドを実行すると

  • Unknown command: 'runserver'
  • Input/output error

などのエラーが発生する。
エラー内容は毎回変わり非常にDjangoが不安定になっていた。

バージョン管理にはgitを使っていて、私は雑なコミットで開発をしていた。
原因を探ろうとgit reset --hard HEAD^でコミットを1つずつ取り消していく。
すると特定のコミット以降でエラーが出ることがわかった。
そのコミットの直後のコミットが怪しいということで、git showでコミットを見ていた。
だが別に変なところはなかった。
ためしにそのコミットの変更をコード上で手動で取り消してみたが、やはりエラーがでる。
原因となるコミットの内容をなかったことにしてもエラーが出ることから他の原因が疑われた。

そこでWebpackの画面を見ると

watchpack Error (initial scan): Error: EIO: i/o error  

というエラーが出ていた。
DjangoでもInput/output errorが出ていたがここでもi/o errorである。
私はディスクの寿命かな? と最初は疑った。
HDDは寿命になるとこういった奇妙な動作をすることがある。

だが諦めずにnode_modulesを削除してnpm installからやり直してみた。
するとnpm install

npm WARN tar TAR_ENTRY_ERROR EIO: i/o error, open '/path/to/npm/node_modules/three/examples/jsm/nodes/lighting/LightingNode.js'  

というエラーが出る。
遠い昔にWindowsとDockerはディスクの相性が悪かったことを思い出した。
そこで検索すると

がヒットした。
Dockerのオプションの-vをやめてみろというアドバイスがあったので試してみることにした。
この-vオプションはホスト側のディレクトリをDocker側にマウントするオプションである。

Dockerコンテナを作り直して-vを使わずに起動。
そしてgitでリモートのプロジェクトをコンテナ内にクローン。
pip installnpm installをやり直してみたところエラーは出ず。

python manage.py runserverも起動してエラーは出ず。
npm run watchでもエラーは出なくなった。

--mountオプションは?

-vではなく--mountオプションでも同様のエラーが出た。

原因は?

WindowsとDockerのディスクの相性が原因かと思われる。
まだ原因を特定したわけではないが、-vオプションの使用をやめるとエラーは出なくなった。

だがホスト側のフォルダをマウントできないと、開発に支障が出る。
vimで開発してもいいが、SublimeText3使いたいなぁ( ´・ω・)

ChatGPT4に聞いてみた

ChatGPT4に聞いてみてたところ以下の返答が得られた。


Windows, Windows用のDocker, npmで開発をしています。以下のエラーがnpm installで出ました。
EIO: i/o error, open '/path/to/npm'
原因を探ったところDockerの-vオプションの使用をやめるとエラーが出なくなりました。原因は何だと思いますか?


Dockerの-vオプションは、ホストOSとコンテナ間でファイルやディレクトリを共有するために使用されます。エラーがnpm install実行時に発生し、-vオプションを使わない場合にエラーが解消されることから、問題はおそらくボリュームマウント(共有ディレクトリ)に関連していると考えられます。

以下のような原因が考えられます:

  • ファイルシステムの違いによる問題: ホストOSとDockerコンテナのファイルシステムが異なる場合、互換性の問題が発生することがあります。これは特にWindowsとLinux間でファイル共有を行っている場合に一般的です。
  • 権限の問題: ホストOSとDockerコンテナ間でファイルやディレクトリのアクセス権限が適切に設定されていない場合、I/Oエラーが発生することがあります。ユーザーやグループの権限を確認し、適切に設定してください。
  • Dockerコンテナ内のパスが正しくない: -vオプションを使用してマウントする際に、コンテナ内のパスが正しく指定されていない場合、エラーが発生することがあります。正しいパスを指定しているか確認してください。

これらの問題を解決するために、以下の手順を試してみてください。

  • ファイルシステムの違いを解決するため、Docker for Windowsの設定で「Use the WSL 2 based engine」を有効にして、WindowsとLinux間の互換性を向上させてください。
  • ホストOSとDockerコンテナ間でのアクセス権限の問題を解決するために、-vオプションでuidとgidを指定して、ホストとコンテナ間でユーザーIDとグループIDを一致させてください。
  • コンテナ内の正しいパスを指定して、マウントポイントを適切に設定してください。

これらの手順で問題が解決しない場合は、さらなるトラブルシューティングが必要になるかもしれません。しかし、上記の提案が多くの一般的な問題に対処できるはずです。


Docker Desktopの「Use the WSL 2 based engine」は有効になっていた。

コンテナ内のnpmのディレクトリの権限を見てみると

drwxrwxrwx 1 root root     4096 Apr 19 02:55 .  
drwxrwxrwx 1 root root     4096 Apr 19 00:11 ..  
-rw-r--r-- 1 root root   178682 Apr 19 02:05 package-lock.json  
-rw-r--r-- 1 root root      962 Apr 19 02:02 package.json  
drwxrwxrwx 1 root root     4096 Apr 12 22:28 src  
-rwxrwxrwx 1 root root     2843 Apr 14 08:17 webpack.config.js  

という感じでオーナーはrootになっていた。
もちろんコンテナへのログインユーザーもrootである。

コンテナの起動をWindowsからWSL2にしてみる

ちなみにエラーの状態ではコンテナはWindowsのコマンドプロンプトやPowerShellから起動している。
ためしにWSL2でコンテナを起動してみることにした。
するとnpm installでエラーが出なくなった。

原因

今回のエラーが出る状態は以下になる。

  • Windows Desktop(Windows用Docker)を使っている
  • コンテナをコマンドプロンプトやPowerShellから起動している
  • npm installでi/o errorが出る

解決策としては

  • Docker Desktopの「Use the WSL 2 based engine」をチェックする
  • コンテナをWSL2以下のBashなどから起動する

になる。
これでエラーが出なくなった。

しかし、今回のエラーだが、今まで順調だったのがある日突然エラーが出るようになった。
これの理由はいまいちわからない。
解決したので良しとする。