1. 概要
Docker上でMarpのwatchモードを使い、Markdownファイルを編集するとスライド(HTML)に自動変換されるようにしていました。
最初は問題なく動いていたのですが、ある日突然「ファイルを更新しても反応しない」という状態に…。
調べてみたものの根本原因は謎のまま、とりあえず動くようになったので、その一連の経緯を共有します。
なお、Marpは一切悪くないです!!
2. 環境
- PC:Apple MacBook Air M2
- Docker:Docker version 28.3.0
- Marp:@marp-team/marp-cli v4.2.0(Dockerイメージ内)
3. 現象の詳細
-
npx marp -w ...
を実行すると初回のMarkdown→HTML変換は正常に実行される - その後
[ INFO ] [Watch mode] Start watching...
が表示され待機状態になる - この状態で先ほどのMarkdownファイルを編集・更新しても無反応
(本来は更新を検知して自動で変換されるはず)
4. 調査と仮説
-
rm _slide.md && touch _slide.md
のように削除して再作成しても、無反応 - エラーメッセージやクラッシュも一切なし。マジ無反応。
明らかに更新が検知されていないので、ls -li
でDockerコンテナ内の対象markdownファイルのinodeを確認してみたところ、ファイルをホスト側で削除して新しく作り直したのに、inodeが変わらないという現象が!!意味不明です。
これ、AIに相談してみたところ、
macOS + Docker Desktop のFUSEファイル共有では、ファイル削除イベントがコンテナ側に即時反映されないことがある
とのこと。これも意味不明。
即時とあるので時間を置いてみましたが、やはり反応しません。
もうちょっと聞いてみたところ、
「削除→再作成」のような操作が、変更ではなく“同一ファイルの更新”と見なされてしまうことがある(inodeが変わらない)
これは chokidarの検知ロジックと相性が悪く、watchが無効になる原因になる
macOSの仮想ファイル共有(gRPC-FUSE)はときどき「詰まる」
などなど、やっぱり何言ってるか分からないし、提示された対策案がことごとく効果がなかったので、AIはこの時点で 切り捨て 脇に置いてます。
5. 解決した操作
いろいろ詰まった末、ターミナルアプリ(WezTerm)を再起動してみました。
それでもやはりwatchモードは効きません。
ですが、その後、新しいタブを開いてそこでwatch
モードを起動すると――
動いた。ファイル更新を検知して、自動変換された。
一方、(原因究明のため)同じタイミングで開いていたiTermでは、最初のウィンドウでも新しいタブでも動きませんでした。
なぜ...?
6. 結論
その後も条件をいくつか変えて試してみましたが、
ターミナル(WezTerm)を再起動&2つ目以降のタブの場合のみ正常に動作する
が現時点での結論です。
なぜそんな事になるのかは、正直分かりません。
🧪 まとめ
つまり……
💡 みんな、困ったらまずWezTermとDockerの再起動!(初心者あるあるですね)