617 words
3 min read

Transforming Development with Docker Compose Watch

By · Solutions Architect · Docker Captain · IBM Champion
Cover image for the post 'Transforming Development with Docker Compose Watch'

Building containers during dev is slow. Slow and repetitive. And it wastes a stupid amount of time, because you end up rebuilding the entire image over a three-line edit in index.js.

Docker Compose Watch fixes that. It’s not some half-baked beta toy either. It does the job.

You change a file, Docker reacts. Instantly. Your app syncs or rebuilds automatically, and you never type docker-compose up --build again just because you renamed a function.

So here’s how it works, plus why I rate it as the best thing to land in local Docker dev since bind mounts.

What Is watch in Docker Compose?#

It’s a feature, still in alpha, that points Docker Compose at your local files and lets it do two things:

  • Sync them into running containers (great for JS, Python, anything with hot reload)
  • Rebuild the container when certain files change (like package.json, requirements.txt, etc.)

So it’s file-watching with intent. Not dumb mirroring. Every update is targeted and rule-driven, which is the whole point.

Sync vs Rebuild: Know the Difference#

Two actions live in your compose.yaml. Here they are.

sync#

- action: sync
path: ./web
target: /src/web
ignore:
- node_modules/
  • Copies host changes into the container on save
  • Doesn’t restart or rebuild the container
  • Perfect for JS/TS/React/Flask/Django/Express/etc.

Treat it as a cleaner, tighter replacement for bind mounts.

rebuild#

- action: rebuild
path: package.json
  • Triggers a full image rebuild when the watched file changes
  • Same as doing docker compose up --build <svc> behind the scenes
  • Ideal for dependency files or compiled languages

Use both. Rebuild on config changes. Sync everything else.

How to Use Docker Compose Watch#

The full loop is short:

  1. Add a x-develop.watch section to your compose.yaml

  2. Start services with:

    Terminal window
    docker compose up --build --wait
  3. Run:

    Terminal window
    docker compose alpha watch

Now your app updates in real time. That’s how development should feel.

Real Example: Node.js App with Hot Reload#

Say your project looks like this:

myproject/
├── web/
│ ├── App.jsx
│ └── index.js
├── Dockerfile
├── compose.yaml
└── package.json

Your compose.yaml:

services:
web:
build: .
command: npm start
x-develop:
watch:
- action: sync
path: ./web
target: /src/web
ignore:
- node_modules/
- action: rebuild
path: package.json

Start the service:

Terminal window
docker compose up --build --wait
docker compose alpha watch

Now edit App.jsx, save, and refresh the browser. Done.

Test It Yourself: Run a Live Demo#

Clone the official demo:

Terminal window
git clone https://github.com/dockersamples/avatars.git
cd avatars
docker compose up -d
docker compose alpha watch

Then hit:

http://localhost:5735

Change something in src/ and watch it reload while you look at it.

Pro Tips#

1. Use Sync for Hot Reload, Rebuild for State Changes#

Example:

  • Sync: ./src, ./templates, .env
  • Rebuild: Dockerfile, package.json, requirements.txt

2. Ignore What Doesn’t Matter#

ignore:
- node_modules/
- dist/
- *.log

Otherwise every temp file you touch kicks off a sync. You don’t want that.

3. Optimize Your Dockerfile#

Lean on multi-stage builds and cache your layers properly:

COPY package.json .
RUN npm ci
COPY . .

Copy too early and Docker throws out the cache on every change.

Not Just for Node.js#

watch works far beyond Node. A few examples:

  • Python/Flask → sync .py, rebuild on requirements.txt
  • Go → rebuild on .go, mount volume for go run
  • Java/Spring → rebuild on .java or pom.xml
  • Rust → rebuild on Cargo.toml, cache your target dir

It’s universal. The only real question is how you structure your watches.

Bonus: No More Bind Mount Weirdness#

Bind mounts are fine, right up until they aren’t. You hit OS quirks. You fight permissions. And on Windows, performance just falls off a cliff.

Sync rules hand you precision. Rebuild triggers hand you control. No quirks attached.

TL;DR#

  • docker compose alpha watch = auto-sync + auto-rebuild
  • Use sync for live reload workflows
  • Use rebuild for dependency changes or compiled code
  • Clean alternative to bind mounts
  • Works with any language, any stack

Final Take#

Dev loops should be fast. Not “wait 10 seconds for a container” fast. Save-and-see-it-immediately fast.

That’s what Docker Compose Watch buys you. It’s not production magic. It’s dev-experience magic, and it holds up.

You write code. Docker handles the rest.


Vladimir Mikhalev

Docker Captain  ·  IBM Champion  ·  AWS Community Builder

The Verdict — production-tested analysis on YouTube.

Related Posts

Same category
  1. 1
    Docker supply chain hardening — from Scout D to OpenSSF 7.8 on a 730K-pull image
    DevOps & Cloud · How I hardened a 730K-pull public Docker image from Scout grade D to OpenSSF Scorecard 7.8. Multi-stage build, cosign signing, SLSA provenance, non-root default, and the incident that changed how I ship attestations.
  2. 2
    Cloudflare Web Analytics on Astro — Why Removing GA4 Unlocked Lighthouse 100
    DevOps & Cloud · How removing Google Analytics 4 from an Astro site unlocked Lighthouse 100, why Cloudflare Web Analytics replaced it, and what the tradeoffs actually cost.
  3. 3
    Platform Engineering — The Complete, Practical Guide to Building Internal Developer Platforms That Scale
    DevOps & Cloud · A deep, practical guide to Platform Engineering. Learn how to build internal developer platforms, golden paths, GitOps workflows, and scalable cloud foundations.
  4. 4
    Amazon Q vs DevOps Chaos — Can This AI Fix AWS Faster Than You?
    DevOps & Cloud · Fix AWS issues faster with Amazon Q, the AI assistant built for DevOps. Real-world examples, limitations, and how it compares to ChatGPT.

Random Posts

Random
  1. 1
    Install Rocket.Chat Using Docker Compose
    Self-Hosting · Step-by-step guide to install Rocket.Chat on Ubuntu Server using Docker Compose and Traefik with Let's Encrypt SSL. Ideal for secure team communication..
  2. 2
    Install Jira Using Docker Compose
    Self-Hosting · Learn how to install Jira using Docker Compose with Traefik and Let's Encrypt. Step-by-step guide to self-host Jira securely and efficiently.
  3. 3
    Install Outline and Keycloak Using Docker Compose
    Self-Hosting · Deploy Outline with Keycloak SSO, Traefik, and MinIO on Ubuntu using Docker Compose. A complete, secure wiki setup with SSL, access control, and cloud storage.
  4. 4
    Docker Scout is the Game-Changer in Container Security
    DevOps & Cloud · Docker Scout simplifies the often complex process of container security, providing a unified view of both direct and transitive dependencies across all image layers.
Transforming Development with Docker Compose Watch
https://heyvaldemar.com/transforming-development-with-docker-compose-watch/
Author
Vladimir Mikhalev
Published
2023-06-15
License
CC BY-NC-SA 4.0