docker/compose · info
watch is not yet configured. Learn more: %s
Error message
watch is not yet configured. Learn more: %s
What it means
Not a failure of compose itself: pressing 'w' in the navigation menu when the project has no watch configuration (lk.Watch == nil) deliberately raises this error, colors a docs link (https://docs.docker.com/compose/file-watch/), and displays it via keyboardError("Watch", ...). It always coexists with an attempt to open the DD watch docs page when Docker Desktop is active. After the error, ToggleWatch(ctx, options) is still called.
Source
Thrown at cmd/formatter/shortcut.go:330
func (lk *LogKeyboard) HandleKeyEvents(ctx context.Context, event keyboard.KeyEvent, project *types.Project, options api.UpOptions) {
switch kRune := event.Rune; kRune {
case 'd':
lk.clearNavigationMenu()
lk.Detach()
case 'v':
lk.openDockerDesktop(ctx, project)
case 'w':
if lk.Watch == nil {
// we try to open watch docs if DD is installed
if lk.IsDockerDesktopActive {
lk.openDDWatchDocs(ctx, project)
}
// either way we mark menu/watch as an error
go func() {
_ = tracing.EventWrapFuncForErrGroup(ctx, "menu/watch", tracing.SpanOptions{},
func(ctx context.Context) error {
err := fmt.Errorf("watch is not yet configured. Learn more: %s", ansiColor(CYAN, "https://docs.docker.com/compose/file-watch/"))
lk.keyboardError("Watch", err)
return err
})()
}()
}
lk.ToggleWatch(ctx, options)
case 'o':
lk.openDDComposeUI(ctx, project)
case 'l':
lk.openDDLogsView(ctx, project)
}
switch key := event.Key; key {
case keyboard.KeyCtrlC:
_ = keyboard.Close()
lk.clearNavigationMenu()
showCursor()
lk.logLevel = NONEView on GitHub (pinned to ddc4b044b6)
Solutions
- Add a develop.watch section to compose.yaml matching services and their sync rules (see the linked docs), then re-run and press 'w'.
- Verify the file you edited is actually part of the merged model: docker compose config | grep -A5 develop.
- If watch is intentionally unused, ignore the message — it is informational and compose keeps running.
- Use `docker compose watch` directly for a clearer error when the config is still missing.
Example fix
# before: compose.yaml
services:
web:
build: .
# after: compose.yaml
services:
web:
build: .
develop:
watch:
- action: sync
path: ./src
target: /app/src
Defensive patterns
Strategy: validation
Validate before calling
// before enabling/pressing 'w', confirm watch config is merged
cfg, err := cli.ToProject(ctx, opts)
if err == nil && cfg.Develop != nil && len(cfg.Develop.Watch) > 0 {
// watch is configured; 'w' will toggle it
} Prevention
- Add a develop.watch section to compose.yaml before using the 'w' shortcut.
- Verify with `docker compose config` that the watch block survived merging.
- Remember the message is informational: compose keeps running.
When it happens
Trigger: docker compose up (attached, with menu) and pressing 'w' when the loaded project model has no develop.watch section — e.g. a plain compose.yaml without a develop: block, or running from a directory where the override carrying watch config was not merged.
Common situations: Expecting `docker compose watch` behavior from the interactive menu without having written a develop.watch config; running `up` on a project whose watch config lives in a compose.override.yaml that was not loaded; muscle-memory 'w' on projects that never opted into watch.
Related errors
- watch rules MUST define a path
- cannot publish compose file with local includes
- use_api_socket can't be used with a Windows Docker Engine
- healthcheck.start_interval requires healthcheck.start_period
- Docker Compose does not support configs.*.driver
AI-assisted analysis of docker/compose@ddc4b044b6 (2026-08-15).
Data as JSON: /api/errors/34e63e7bdd14ae71.
Report an issue: GitHub.