【解決策】Vagrant + Docker環境で起動中のNodeアプリのファイル変更時にnodemonの再起動が走らない問題の原因と対応

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Vagrantで立てたDocker内で起動しているNode.jsの再起動ツールnodemonがファイル変更時に再起動しない問題の対処をメモしました。
経緯
Vagrantで立てたdocker内で起動しているNode.jsのアプリのdebugの際に開発モードとnodemonを利用して ファイル保存時に再起動させたかったがなぜか再起動されなかったため調査したことがきっかけです。
構成
Vagrant > Docker > Webアプリ
設定
nodemon.json
Docker内で利用しているnodemon.jsonの設定です。
json// nodemon.json
{
"watch": ["src"],
"ext": "ts",
"project": "./tsconfig.json",
"ignore": ["src/**/*.spec.ts"],
"exec": "ts-node ./src/index.ts",
}
Docker内で利用しているアプリのpackage.jsonのnpm scriptsの設定です。
package.json
json// package.json
"scripts": {
"develop": "NODE_ENV=develo nodemon"
}
環境
- Vagrant 2.2.16
- VirtualBox 6.1.22 r144080
- Docker 20.10.2
- docker-compose 1.25.0
- Node.js 14.17
- nodemon 2.0.7
事象の再現手順
通常通りnpm scriptsでdevelopコマンドで起動します。
zsh$ yarn develop
yarn run v1.22.10
$ NODE_ENV=develop nodemon
[nodemon] 2.0.7
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): src/**/*
[nodemon] watching extensions: ts
[nodemon] starting `ts-node ./src/index.ts`
listening on *:8080
起動は正常にできるのですが、保存しても再起動が走りません。
--legacy-watchのオプションを指定して解決
コマンド実行時
コマンド実行時に--legacy-watch
のオプションを指定して起動します。
zsh$ nodemon --legacy-watch
or
$ nodemon -L
nodemon.json
nodemon.jsonで設定を書いている場合は下記の形でlegacyWatch true
の設定を追加します。
nodemon.json{
"legacyWatch": true
}
原因
一部のネットワーク環境(マウントされたドライブ全体でnodemon読み取りを実行するコンテナーなど)では
Chokidarのポーリングを有効にするlegacyWatch:true
を使用する必要があるようです。
- review
もう無駄な努力はしない!『イシューからはじめよ』安宅和人著で身につけた、99%の人が知らない本当に価値ある問題の見つけ方
- review
もう朝起きるのが辛くない!『スタンフォード式 最高の睡眠』西野精治著で学んだ、たった 90 分で人生が変わる睡眠革命
- review
もう「なんとなく」で決めない!『解像度を上げる』馬田隆明著で身につけた、曖昧思考を一瞬で明晰にする技術
- review
もう疲れ知らず!『最高の体調』鈴木祐著で手に入れた、一生モノの健康習慣術
- review
人生が激変!『苦しかったときの話をしようか』森岡毅著で発見した、本当に幸せなキャリアの築き方
- review
もう「何言ってるの?」とは言わせない!『バナナの魅力を 100 文字で伝えてください』柿内尚文著 で今日からあなたも伝え方の達人!