このやり方が正しいとは思えないけどとりあえずメモ。
要点
-
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/hoge
でnpm 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オプションをつけると成功する理由