第22章:Compose Watchで編集→自動反映を作る👀✨
この章では、ファイル保存したらコンテナに自動で反映される開発ループを作ります💨 「毎回ビルドして起動し直す地獄」から卒業しよう〜!🎉
1) Compose Watchって何が嬉しいの?🤔💡
Compose Watchは、ローカルのファイル変更を見張って👀 必要に応じて…
- 📦 変更ファイルをコンテナに同期(sync)
- 🔁 依存更新などがあったら再ビルド(rebuild)
- ♻️ 設定変更などは同期して再起動(sync+restart)
- 🧰 必要なら同期してコマンド実行(sync+exec)
…みたいに“いい感じに”更新してくれる仕組みです。
しかも Nodeの node_modules/ を同期しない運用がしやすいのが大きい✨(Windows ⇄ Linux コンテナでネイティブ依存が混ざると壊れがち)(Docker Documentation)
使うには Docker Compose 2.22.0+ が必要です。(Docker Documentation)
2) まずは最短の動く形(結論)🏁✨
基本は compose.yaml の各サービスに develop: watch: を書いて、
起動を docker compose up --watch(または docker compose watch)に変えるだけです。(Docker Documentation)
3) ハンズオン:Node/TS APIを「保存→即反映」にする🧑💻🔥
ここでは「TSのソースは同期」「依存が変わったら再ビルド」を作ります👍
3-1. ざっくり構成📁
src/:TypeScriptのソースpackage.json/ lock:依存関係compose.yamlDockerfile
3-2. Dockerfile(例)🐳
ポイントは👇
- Watch が使うために、イメージ内に
stat/mkdir/rmdirが必要(多くのLinuxベースなら普通に入ってるけど、超ミニマルだと無いことがある)(Docker Documentation) - さらに、同期先(target)に書き込めるユーザーであることが必要(Docker Documentation)
## Dockerfile(例)
FROM node:22-bookworm-slim AS dev
WORKDIR /app
## 依存だけ先に入れる(キャッシュ効く)
COPY package*.json ./
RUN npm ci
## ソースをコピー(watchの初期状態にもなる)
COPY . .
EXPOSE 3000
CMD ["npm", "run", "dev"]
3-3. compose.yaml(例)🧩
services:
api:
build:
context: .
target: dev
ports:
- "3000:3000"
command: npm run dev
develop:
watch:
# ✅ TSソースは同期(コンテナは作り直さない)
- action: sync
path: ./src
target: /app/src
initial_sync: true
ignore:
- node_modules/
- dist/
# ✅ 依存が変わったら再ビルド(npm ciが走る)
- action: rebuild
path: package.json
- action: rebuild
path: package-lock.json
ここでの重要ポイント👇
path:はプロジェクト相対でOK。ディレクトリは再帰的に監視されます。(Docker Documentation)ignore:はpathからの相対で効きます(ここ超ハマりどころ!)(Docker Documentation)initial_sync: trueにすると、既存コンテナがあるとき開始時にズレを直してくれます🧹(Docker Documentation).dockerignoreのルールが watch にも影響します(暗黙の ignore として読み込まれる)(Docker Documentation)
3-4. 起動コマンド🚀
-
ふつうにログも見たい:
docker compose up --watch(公式でもこの流れで説明されています)(Docker Documentation)
-
watchの出力だけ見たい(ログが混ざるのがイヤ):
docker compose watchさらに
watchには--no-up(起動せずwatchだけ)などもあります。(Docker Documentation)
3-5. 動作確認✅
-
src/のTSを1行変えて保存💾 -
ターミナルに「syncしたよ」的なログが出る👀
-
アプリ側(
npm run devのwatch)が反応してホットリロード/再起動✨- もしアプリ側watchが無いなら、次の「sync+restart」を使うのが楽!
4) “熱い”実戦パターン集🔥(どれ使う?)
A. ふだんはこれ:sync(ソースだけ反映)✍️
- TS/JS、テンプレ、静的ファイルなど
- コンテナ作り直さないので速い💨(Docker Documentation)
B. 依存が変わったら:rebuild 📦
package.json/ lock- Prismaの生成物やビルド手順が変わるとき
- 変更後にイメージを再ビルドしてコンテナ作り直します(Docker Documentation)
C. 設定変更を反映したい:sync+restart ♻️
例:nginx.conf、一部設定ファイル
- 同期してから再起動してくれるので手動restartが消える✨(Docker Documentation)
D. “再起動じゃなくてコマンド叩きたい”:sync+exec 🧰
例えば「設定を同期したら reload コマンドを打つ」みたいな用途。
sync+exec は Compose 2.32+ で使えます。(Docker Documentation)
5) Windowsでハマりやすいポイント集🪟🧯
✅ 監視が重い / CPUが回る😵💫
- watch対象を絞る(
pathをデカいリポジトリ直下にしない) ignoreでnode_modules/やdist/を切る(超重要)(Docker Documentation)
✅ 反映されない(保存しても動かない)🙃
チェック順はこれ👇
-
サービスが
build:で作られてる?image:だけのサービスは watch で変更追えません。(Docker Documentation) -
同期先(target)に書き込める? コンテナの
USERが書き込めないと失敗します。必要ならCOPY --chownも検討。(Docker Documentation) -
イメージに
stat/mkdir/rmdirが入ってる? これが無いと watch が期待通り動かないことがあります。(Docker Documentation) -
.dockerignoreが強すぎない?.dockerignoreのパターンが watch にも影響します。(Docker Documentation) (*で全部無視してる系は特に注意⚠️)
6) ちょい演習💪😺
src/hello.tsを編集 → syncが走るのを確認👀package.jsonに依存を1つ追加 → rebuildが走るのを確認📦config/を作って設定ファイルを置く →sync+restartにして 設定変更で再起動を体験♻️
7) この章のまとめ🎁✨
- Compose Watchは 「保存したら勝手に反映」 を Compose 側で支える仕組み👀(Docker Documentation)
- コツは「ソースはsync」「依存はrebuild」「設定はsync+restart」💡(Docker Documentation)
- Windowsでは node_modulesを同期しないのが安定ルート🪟✨(Docker Documentation)
次の章(第23章)は、docker compose run を使って **migrate / seed / test / lint を“一回だけ実行”**できるようにして、手順をもっと短くしていくよ〜!🗡️🧴