What's Changed
ℹ️ Heads-up for users of Compose as a library:
Upnow runs its Create and Start phases as a single plan over a single daemon snapshot, forup -d(#14290) and interactiveup(#14305), asscale, watch rebuilds andstartalready do (#14291, #14296). The CLI behaves as before. If you callapi.Compose.Upfrom your own program:
Upnow validates its options first, with the same rules as the CLI flags:UpOptions.Validate()returns an*api.IncompatibleOptionsError(errors.Is(err, api.ErrIncompatibleOptions)) forStart.Waitcombined withStart.Attach, and for a detachedUp(noStart.Attach) combined withOnExit,ExitCodeFromorWatch. Those combinations used to be silently ignored (#14306).Upworks on the project it is given and ignoresStartOptions.Project.- The daemon is not observed again between the two phases: a container that exits after the plan is built is not started again, and one removed in between makes its start fail instead of being skipped. A planning error of the Start phase now fails before any container is created.
- A foreground
Upnow gives ause_api_socketservice its/run/secrets/docker/config.json, asup -ddoes, and shows the output ofpre_starthooks.- The keyboard menu of an interactive
upis no longer built by the library: setNavigationMenu: trueand pass an implementation withcompose.WithNavigationMenu(...), otherwise no menu is displayed and a warning says so (#14324).Other changes to the library surface in this release:
DownOptions.Imagesis now anapi.ImagePruneMode(untyped constants still compile, astringvariable needs a conversion) and an invalid value is rejected beforeDownremoves anything (#14149);compose.ServiceHash,compose.NetworkHashandcompose.VolumeHashare no longer exported, the helpers having moved to an internal package (#14405);api.Composeis now assembled from six smaller interfaces, with the same method set (#14322);PushOptions.IgnoreMissingis added.
✨ Improvements
Execution plan
- Feat: detached up runs on a single plan by @ndeloof in #14290
- Feat(up): interactive up runs on a single plan by @ndeloof in #14305
- Feat: scale and watch rebuild use the unified plan by @ndeloof in #14291
- Feat: compose start builds a start-only plan by @ndeloof in #14296
Commands
- Feat(run): --no-recreate reuses existing dependencies as-is by @ndeloof in #14144
- Feat(push): add --ignore-missing to skip images not available locally by @glours in #14341
- Feat(push): deprecate --ignore-push-failures in favor of --ignore-missing by @glours in #14354
- Feat(stats): add --all-projects and --aggregate flags by @glours in #14337
- Feat(network): let a service opt out of its name as a network alias by @glours in #14342
- Pass --parallel limit to bake as --jobs by @maxproske in #14352
Other
- Feat: support the umask service attribute by @ndeloof in #14367
- Use the Docker Desktop Hub session for Docker Hub registry credentials by @Benehiko in #14295
🐛 Fixes
- Fix(bridge): reject --dry-run on bridge commands by @glours in #14307
- Fix(up): don't report a cancelled or expired wait on an optional dependency as skipped by @ndeloof in #14309
- Fix(logs): relay each line of a restarted container exactly once by @ndeloof in #14314
- Fix(bake): grant permissions for configured build inputs by @crazy-max in #14325
- Fix(watch): skip sync+exec triggers on bind-mounted paths by @glours in #14328
- Fix: pre_start hooks receive the service env_file and environment by @ndeloof in #14293
- Fix: keep the image pull of compose run inside the run progress block by @ndeloof in #14294
- Fix: do not execute providers and models in dry-run mode by @glours in #14334
- Fix(build): read bake's stderr to the end before waiting for it by @ndeloof in #14335
- Fix(executor): a wait node holds no --parallel slot while it polls by @ndeloof in #14303
- Fix(pre_start): capture a hook's output by opening its log stream once started by @ndeloof in #14353
- Fix(run): keep a recreated dependency's anonymous volumes by @htoyoda18 in #14358
- Fix(watch): ignore .git at any depth inside the watched path by @htoyoda18 in #14363
- Fix(executor): report the services a failed start interrupts by @ndeloof in #14376
- Fix(monitor): subscribe to events since before the initial listing by @ndeloof in #14304
- Fix(compose): skip the lowered-environment allocation in envResolverWithCase by @TDnorthgarden in #14390
- Fix(projectloader): unescape service names in unsupported attribute warnings by @Huang-404-Q in #14380
- Fix(down): keep a volume the project does not own on down -v by @htoyoda18 in #14374
- Fix(start): give a started use_api_socket service its config file by @ndeloof in #14393
- Fix(up): honor -t when an attached up stops the application by @htoyoda18 in #14395
- Fix(up): check a depends_on condition before the first poll tick by @htoyoda18 in #14385
- Fix(watch): recognize bind-mounted paths starting with two dots by @ahbaqdadi in #14425
- Fix(use_api_socket): harden the credentials handed to the service by @ndeloof in #14402
🔧 Internal
- Executor: run start-phase operations (epic #14081, lot 1) by @ndeloof in #14274
- Api: DownOptions.Images becomes a typed ImagePruneMode, validated upfront by @ndeloof in #14149
- Api: reject incompatible Up options with a typed error by @ndeloof in #14306
- Refactor: split create() into preparePlan + execute by @ndeloof in #14289
- Refactor(executor): let a caller drive the create and start phases itself by @ndeloof in #14302
- Refactor(api): split Compose into focused interfaces by @ndeloof in #14322
- Refactor(compose): move mutable package-level state into composeService by @ndeloof in #14323
- Refactor(up): inject the navigation menu instead of importing cmd/formatter by @ndeloof in #14324
- Refactor: extract inspect and projectloader from pkg/compose into internal packages by @ndeloof in #14331
- Refactor: move the provider relay and plugin execution to internal/relay and internal/provider by @ndeloof in #14333
- Refactor(executor): hand the hook-log listener to runStart only by @ndeloof in #14392
- Refactor: move exec, cp, export and commit to internal/containerops by @ndeloof in #14397
- Refactor: move the config-hash helpers to internal/confighash by @ndeloof in #14405
- Refactor: add internal/concurrency for the bounded errgroup helpers by @ndeloof in #14422
- Refactor: remove the helpers duplicated across pkg/compose and the internal packages by @ndeloof in #14424
- Docs(compose): drop the comments that still describe the deleted imperative start path by @ndeloof in #14398
- Docs(compose): correct what the startMx comment says about #12846 by @ndeloof in #14399
- Refactor(compose): drop the timeout parameter of waitDependencies by @ndeloof in #14400
- Refactor(compose): move the dependency wait helpers to their own file by @ndeloof in #14401
- Ci: run unit tests with -race, pin test tooling, add a ci-ok aggregate check by @ndeloof in #14321
- Go.mod: keep go patch version at lowest possible by @thaJeztah in #14347
- Build(lint): bump golangci-lint to v2.15.0 and fix its new findings by @ndeloof in #14418
- Test(e2e): lock the behavior of the foreground up by @ndeloof in #14300
- Test(formatter): keep escape sequences out of the go test output by @htoyoda18 in #14351
- Docs: remove broken CONTRIBUTING.md link by @DaneHarrison in #14251
⚙️ Dependencies
- Build(deps): golang.org/x/net v0.60.0 (security) by @thaJeztah in #14316
- Chore(deps): bump github.com/containerd/containerd/v2 v2.4.2 (security) by @thaJeztah in #14339
- Update to go1.26.9 (security) by @thaJeztah in #14315
- Update to go1.26.10 (security) by @thaJeztah in #14366
- Build(deps): bump github.com/mattn/go-shellwords from 1.0.15 to 1.0.16 by @dependabot[bot] in #14320
- Build(deps): bump github.com/docker/cli from 29.8.2+incompatible to 29.9.0+incompatible by @dependabot[bot] in #14319
- Build(deps): bump github.com/moby/moby/client from 0.6.1 to 0.6.2 by @dependabot[bot] in #14318
- Build(deps): bump github.com/docker/secrets-engine/x from 0.8.2 to 0.8.3 by @dependabot[bot] in #14301
- Build(deps): bump secrets-engine client to v0.2.0 by @Benehiko in #14327
- Build(deps): bump secrets-engine/client to v0.2.2 by @Benehiko in #14361
- Build(deps): bump github.com/Microsoft/go-winio from 0.6.3-0.20251027160822-ad3df93bed29 to 0.6.3 by @dependabot[bot] in #14330
- Build(deps): bump golang.org/x/sync from 0.23.0 to 0.24.0 by @dependabot[bot] in #14329
- Build(deps): bump github.com/mattn/go-runewidth from 0.0.30 to 0.0.31 by @dependabot[bot] in #14348
- Build(deps): bump github.com/docker/cli from 29.9.0+incompatible to 29.9.1+incompatible by @dependabot[bot] in #14349
- Build(deps): bump actions/upload-artifact from 7.0.1 to 7.0.2 by @dependabot[bot] in #14343
- Build(deps): bump actions/download-artifact from 8.0.1 to 8.0.2 by @dependabot[bot] in #14344
- Build(deps): bump github/codeql-action/upload-sarif from 4.38.2 to 4.38.3 by @dependabot[bot] in #14350
- Build(deps): bump golang.org/x/sys from 0.48.0 to 0.49.0 by @dependabot[bot] in #14338
- Build(deps): bump ossf/scorecard-action from 2.4.4 to 2.5.0 by @dependabot[bot] in #14360
- Build(deps): bump docker/bake-action from 7.4.0 to 7.5.0 in the docker-actions group by @dependabot[bot] in #14371
- Build(deps): bump github.com/docker/cli from 29.9.1+incompatible to 29.9.2+incompatible by @dependabot[bot] in #14369
- Build(deps): bump github.com/Microsoft/go-winio from 0.6.3 to 0.6.4 by @dependabot[bot] in #14368
- Build(deps): bump the docker-actions group with 2 updates by @dependabot[bot] in #14389
- Build(deps): bump github/codeql-action/upload-sarif from 4.38.3 to 4.39.0 by @dependabot[bot] in #14377
- Build(deps): bump docker/github-builder/.github/workflows/bake.yml from 1.18.0 to 1.18.1 in the docker-actions group by @dependabot[bot] in #14415
- Build(deps): bump github/codeql-action/upload-sarif from 4.39.0 to 4.39.1 by @dependabot[bot] in #14416
New Contributors
- @Benehiko made their first contribution in #14295
- @DaneHarrison made their first contribution in #14251
- @TDnorthgarden made their first contribution in #14390
- @Huang-404-Q made their first contribution in #14380
- @ahbaqdadi made their first contribution in #14425
Full Changelog: v5.6.1...v5.7.0