npm installでi/o error【Windows, Docker, Webpack】
目次
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 watch
はwebpack --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 install
やnpm 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などから起動する
になる。
これでエラーが出なくなった。
しかし、今回のエラーだが、今まで順調だったのがある日突然エラーが出るようになった。
これの理由はいまいちわからない。
解決したので良しとする。