Skip to main content

Compose Watch

Compose File Watch is a feature introduced in Docker Compose version 2.22.0. It allows for automatic updates and previews of your running Compose services as you edit and save your code. This can enable a hands-off development workflow once Compose is running, as services automatically update themselves when you save your work.

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

The watch attribute in the Compose file defines a list of rules that control these automatic service updates based on local file changes. Each rule requires a path pattern and an action to take when a modification is detected. The action can be set to rebuild, sync, or sync+restart.

Here's a brief explanation of these actions:

  • rebuild: Compose rebuilds the service image based on the build section and recreates the service with the updated image.
  • sync: Compose keeps the existing service container(s) running, but synchronizes source files with container content according to the target attribute.
  • sync+restart: Compose synchronizes source files with container content according to the target attribute, and then restarts the container.

You can also define a list of patterns for paths to be ignored using the ignore attribute. Any updated file that matches a pattern, or belongs to a folder that matches a pattern, won't trigger services to be re-created. To use Compose Watch, you need to add the watch instructions to your compose.yaml file and then run your application with the docker compose watch command.

file watch actions

Getting Startedโ€‹

Clone the repositoryโ€‹

git clone https://github.com/dockersamples/getting-started-todo-app/
cd getting-started-todo-app

Switch to compose-watch branchโ€‹

git checkout compose-watch

Bringing up the appโ€‹

docker compose watch

Make some changesโ€‹

Open a new terminal and modify the following package under frontend/package.json from

"optionalDependencies": {
"fsevents": "^2.1.2"

to

"optionalDependencies": {
"fsevents": "^2.1.3"

You will find that the frontend service gets rebuild automatcially for you

[+] Running 6/6
โœ” Network getting-started-todo-app_express-mongo Created 0.1s
โœ” Network getting-started-todo-app_react-express Created 0.0s
โœ” Container mongo Started 1.1s
โœ” Container getting-started-todo-app-mongoexpress-1 Started 1.1s
โœ” Container backend Started 1.3s
โœ” Container frontend Started 1.8s
Watch enabled
Rebuilding service "frontend" after changes were detected...
[+] Building 52.5s (12/12) FINISHED docker-container:my-builder
=> [frontend internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 532B 0.0s
=> [frontend internal] load metadata for docker.io/library/node:lts-buster 1.1s
=> [frontend internal] load .dockerignore 0.0s
=> => transferring context: 67B 0.0s
=> [frontend 1/6] FROM docker.io/library/node:lts-buster@sha256:479103df06b40b90f189461b6f824a62906683e26a32c77d7c3e 0.0s
=> => resolve docker.io/library/node:lts-buster@sha256:479103df06b40b90f189461b6f824a62906683e26a32c77d7c3e2d855a0e3 0.0s
=> [frontend internal] load build context 0.0s
=> => transferring context: 1.94kB 0.0s
=> CACHED [frontend 2/6] WORKDIR /usr/src/app 0.0s
=> [frontend 3/6] COPY package.json /usr/src/app 0.0s
=> [frontend 4/6] COPY package-lock.json /usr/src/app 0.0s
=> [frontend 5/6] RUN npm ci 24.4s
=> [frontend 6/6] COPY . /usr/src/app 0.3s
=> [frontend] exporting to docker image format 26.5s
=> => exporting layers 8.4s
=> => exporting manifest sha256:c3639997f048e5adea7487bafdafaf4ea3f946e071fd273aefb262b72f2c87a8 0.0s
=> => exporting config sha256:1eb3a22fdb9d89316c9bdb1eb1d9f138e0f9545e95af4d812c9db8499309b491 0.0s
=> => sending tarball 18.1s
=> [frontend] importing to docker 10.0s
=> => loading layer 7544a5e696a4 567B / 567B 10.0s
=> => loading layer 6e1b4449163b 32.77kB / 128.96kB 9.9s
=> => loading layer 874fffdf421f 115.87MB / 121.34MB 9.9s
=> => loading layer b8d4de9612f2 27.14kB / 27.14kB 0.0s
service "frontend" successfully built