Docker Compose Tip #86: Three sync bugs that made watch unpredictable

Tip #11 covered sync and rebuild. One watch attribute it didn’t cover: initial_sync, which re-syncs a path into containers that already exist, for when you reattach watch to a stack that’s still running. services: web: build: . develop: watch: - path: ./src target: /app/src action: sync initial_sync: true Three separate bugs in that sync path, and one in sync generally, got fixed in 5.5.1. ...

September 16, 2026 · 3 min · 508 words · Guillaume Lours

Docker Compose Tip #85: What docker compose alpha actually means

Run docker compose alpha --help and Compose is upfront about what that word means: EXPERIMENTAL: docker compose alpha is an experimental feature. Experimental features provide early access to product functionality. These features may change between releases without warning, or can be removed from a future release. Not a beta, not a preview with a stable target date. A command under alpha can change its flags, its output format, or disappear entirely in the next release, with no deprecation notice. Build a script around one and a routine docker compose upgrade can break it silently. ...

September 14, 2026 · 3 min · 453 words · Guillaume Lours

Docker Compose Tip #84: Lifecycle hooks now show you why they failed

A failing lifecycle hook, post_start, pre_stop, or the new pre_start, used to report only its exit code: db hook exited with status 1 What the hook actually printed depended on how it ran. Under a plain docker compose up, the output streamed live to the terminal, mixed into the rest of up’s output, but was never carried into the error message itself. Under restart, run, or any tool driving Compose as a library, there was no listener attached at all, so Compose didn’t even request stdout or stderr from the daemon, and there was nothing to read afterward, live or otherwise. Since Compose 5.5.1, both cases keep a tail of the output and fold it straight into the error on failure. ...

September 11, 2026 · 2 min · 371 words · Guillaume Lours

Docker Compose Tip #83: Why up recreated containers that never changed

A service recreates on every single docker compose up. No file change, no rebuild, nothing actually different about the image. Before Compose 5.5.0, that wasn’t a flaky environment, it was a real bug class in how Compose decided an image had changed. One image, three ways to name its digest Compose decides whether to recreate a container by comparing the image’s current identity against a label it recorded last time, com.docker.compose.image. Before 5.5.0, that identity was computed differently depending on how the image got there: ...

September 9, 2026 · 3 min · 578 words · Guillaume Lours

Docker Compose Tip #82: pre_start hooks and native init containers

Tips are back after the summer break, and there are three months of Compose releases to catch up on, v5.2.0 through v5.5.1 shipped while the series was paused. The biggest addition: native init containers, through a new pre_start lifecycle hook. What pre_start does Tip #41 covered post_start and pre_stop, which run a command inside the already-running service container. pre_start is different: each step runs in its own ephemeral container, created after the service container exists but before it starts. It also waits on the service’s own depends_on conditions first, so a step can talk to those dependencies exactly like the main service command does. ...

September 7, 2026 · 4 min · 729 words · Guillaume Lours