Posted at

WindowsのDocker環境でnpm install実行時にエラーが出た場合の対処法メモ

More than 1 year has passed since last update.

このやり方が正しいとは思えないけどとりあえずメモ。


要点



  • npm installはコンテナでマウントされていないディレクトリで行う


  • npm installには--no-bin-linksオプションを付ける


事象

Dockerのコンテナ内でnpm installを行うと以下のようなエラーが出ることがある。

npm ERR! path /usr/local/hoge/node_modules/abbrev/package.json.920591357

npm ERR! code ETXTBSY
npm ERR! errno -26
npm ERR! syscall rename
npm ERR! ETXTBSY: text file is busy, rename '/usr/local/hoge/node_modules/abbrev/package.json.920591357' -> '/usr/local/hoge/node_modules/abbrev/package.json'

npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2018-08-04T08_11_53_004Z-debug.log

調べた結果、ホストであるWindowsからコンテナにマウントされているディレクトリでnpm installを行うとこのようなエラーになるらしい。

(試していないが、Vagrantの共有フォルダでも同じことが起こるらしい。)

例えば、以下のようなコマンドで立ち上げたコンテナの/usr/local/hogenpm installを行うとエラーになる。

$ docker run hogehoge -it -v `pwd`:/usr/local/hoge


解決策

要は、マウントされているディレクトリで実行しなければいいのだから、以下のようにしてエラーを回避した。


  • マウントされていないディレクトリへpackage.jsonを移動

  • package.jsonを移動させたディレクトリでnpm install --no-bin-linksを実行

  • node_modulesディレクトリを元々npm installを実行する予定だったディレクトリに丸ごと移動

$ cd /tmp

$ cp /usr/local/hoge/package.json
$ npm install --no-bin-links

:
:

$ mv ./node_modules /usr/local/hoge/

--no-bin-linksオプションを付けることで、npm installの過程でシンボリックリンクを作成しなくなる。

Virtual Boxでは共有フォルダにシンボリックリンクを作成できないため、このオプションを指定しないと、node_modulesディレクトリをマウントされているディレクトリに移動させるときにエラーとなってしまう。

参考

【npm】【Vagrant】Vagrantの共有フォルダ上でnpm installすると失敗する原因と、–no-bin-linksオプションをつけると成功する理由