Docker Compose の watch モードを使い始めたら、開発中のコンテナ再起動が不要になった話

開発中にファイルを変更するたびにコンテナを手動で再起動していたのが、Docker Compose の watch モードで自動同期できるようになり、開発体験がかなり改善されました。設定方法と実際の感想をまとめます。

🙌 結論から

Docker Compose の watch モードを使い始めたところ、ホスト側のファイル変更をコンテナへリアルタイムで自動同期できるようになり、開発中の docker compose restart がほぼ不要になりました!

以前は「コードを少し直しただけなのにコンテナを再起動する」という手間が、毎回さりげなくストレスになっていたのですが、それが解消されるとかなり快適です。

Node.js だけでなく他の言語でも使えるので、Docker を使って開発している方にはぜひ試してほしい機能です(^^)

💡 watch モードとはなにか

Docker Compose v2.22 で正式追加され、現在の v5 系でも引き続き使える定番機能です。最近のリリースでは Docker Bake との連携でビルドの並列化・キャッシュ効率もさらに改善されています。

compose.yamlwatch の設定を書いておくと、ホスト側のファイルを監視して変更があったときにコンテナへ自動で同期してくれます。

volumes でのマウントと似ていますが、watch の場合は変更があったタイミングだけ同期するため、マウント方式よりパフォーマンスの問題が出にくいケースがあります。

特に macOS で Docker Desktop を使っていると、volumes によるマウントが遅くなる問題を経験した方も多いのではないでしょうか(´・ω・`)

watch モードはそのあたりを回避しやすい選択肢として、個人的にかなり注目しています。

👀 設定方法

compose.yamldevelop.watch の設定を追加するだけです。

services:
  app:
    build: .
    ports:
      - "3000:3000"
    develop:
      watch:
        - action: sync
          path: ./src
          target: /app/src
        - action: rebuild
          path: package.json

action には以下の3種類が使えます。

  • sync — ホストのファイルをコンテナにコピーするだけ。Node.js のホットリロードと組み合わせると効果的です
  • rebuild — イメージを再ビルドしてコンテナを再作成します。package.json の変更時などに設定します
  • restart — コンテナを再起動します

起動するときは --watch オプションをつけるだけです。

docker compose up --watch

これだけでファイル変更が自動でコンテナに反映されます!

Node.js の場合は --watch フラグ(Node.js 内蔵)や nodemon と組み合わせることで、ファイル変更 → コンテナ同期 → サーバー自動再起動まで連携できます(・∀・)

✨ 使ってみた感想

実際に試してみて、いくつか気づきがありました。

  • 導入がシンプル: 既存の compose.yaml に数行追加するだけで始められるので、チームへの共有もかなりしやすかったです
  • syncrebuild の使い分けが大事: package.json の変更を sync に設定していると依存関係が更新されないので、rebuild を設定する必要があります。最初はここでハマりました(・_・;)
  • volumes との比較: macOS 環境でのマウント速度の問題が多少改善された感覚がありました。環境によって差があるので一概には言えませんが、試す価値はあると思います

使い始めてからは「コンテナを再起動し忘れてコードが反映されていない」という意外と多かったミスがなくなって、ストレスがだいぶ減りました。

🔄 sync+restartで一部だけ再起動する運用

syncrebuild の使い分けに慣れてきたところで、もう一つ**sync+restart**というアクションがあることに気づきました。

これは「ファイルをコンテナに同期したあと、コンテナ自体は再ビルドせずに再起動だけする」という、syncrestart の中間のような動きをします。

develop:
  watch:
    - action: sync+restart
      path: ./config
      target: /app/config

私は Node.js のホットリロードが効かない設定ファイル(環境変数を読み込む起動時処理など)に、この sync+restart を割り当てるようにしました。

sync だけだとファイルは更新されるのにプロセスが古い設定を読み込んだままになりますし、rebuild を使うとイメージの再ビルドが走って余計に時間がかかります。

「ファイル自体はコピーで十分、でもプロセスの再起動は必要」という中間のニーズにちょうどハマる選択肢でした(・∀・)

syncsync+restartrebuild の3段階を、変更内容の重さに応じて使い分けるようになってから、開発中の待ち時間がさらに削れた感覚があります。

パパ系Webエンジニア〜愛用ガジェット一覧 🛍️

この記事を書いている作業環境のガジェットを楽天ROOMにまとめています ✨ 在宅エンジニアのデスク作りの参考にどうぞ 🙌

👍 まとめ

Docker Compose の watch モードは、開発中のコンテナ再起動を減らしてホットリロードを実現したいときに、設定がシンプルでかなり使いやすい機能です。

compose.yaml への数行の追記だけで始められるので、Docker を使っているプロジェクトならすぐに試せます。

「毎回コンテナを再起動するのが面倒」「volumes のマウントが遅い」と感じている方は、ぜひ一度試してみてください🙌

※ Docker Composeのバージョンによって使える機能が異なります。最新情報は Docker公式ドキュメント をご確認ください👀