Skip to content

Reconciliation plan - #13830

Merged
glours merged 17 commits into
docker:mainfrom
ndeloof:reconciliation_plan
Jun 8, 2026
Merged

Reconciliation plan#13830
glours merged 17 commits into
docker:mainfrom
ndeloof:reconciliation_plan

Conversation

@glours

Copy link
Copy Markdown
Contributor

What I did
this is an alternative for #13641
based on previous work, I first generated an analysis an plan document, so AI work on this significant refactoring is better guided and impact is well understood

(not mandatory) A picture of a cute animal, if possible in relation to what you did

ndeloofand others added 17 commits June 8, 2026 16:19
Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
String() is designed to make it easy to compare coomputed plan vs expectations
Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
- Remove the `convergence` struct and `newConvergence` constructor
- Extract `resolveServiceReferences` as a standalone function taking
`map[string]Containers` instead of a method on convergence
- Add `getContainersByService` helper on composeService
- Update run.go and executor.go to use the new standalone function
- Remove dead code: `getObservedState`, `setObservedState`
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
…remove
- Fix ContainerReplaceLabel detection: use op.Inherited != nil (not
op.Container) as signal for recreate in execCreateContainer
- Use observed network name (not desired) for DisconnectNetwork and
RemoveNetwork operations, in case the name changed
- Use observed volume name (not desired) for RemoveVolume operations
- Update reconciliation.md with 3 new lessons learned (7.8, 7.9, 7.10)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
- plan.go: pin OperationType constants to explicit values so adding an op
in the middle doesn't shift the others.
- executor.go: remove the meaningless `var _ = getContainerProgressName`
line — same-package functions are always accessible.
- reconcile.go: fix the stale switch-default comment that contradicted
the case clause above it.
- reconcile.go: drop the local `serviceLabel` const that shadowed
`api.ServiceLabel` and use the shared constant.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Guillaume Lours <glours@users.noreply.github.com>
ensureProjectVolumes already prompts the user when a volume's config hash
diverges from the compose file (create.go:1626) and recreates it on confirm.
The reconciler ran after ensureProjectVolumes and prompted again with the
exact same message — so a user who declined the first prompt was asked the
same question a second time.
Drop the prompt + recreate call from reconcileVolumes(). Recreation of
diverged volumes stays owned by ensureProjectVolumes; the reconciler only
plans the creation of missing volumes. If the user declined recreation,
the existing container's mounts still match the existing volume name and
hasVolumeMismatch correctly returns false, so containers are not falsely
flagged as obsolete.
Keep the supporting infrastructure available for future use, when
divergence detection migrates fully into the reconciler:
- reconciler.prompt field
- prompt parameter on reconcile()
- planRecreateVolume function (//nolint:unused)
- servicesUsingVolume function (//nolint:unused)
- noPrompt test helper
The reframed test (TestReconcileVolumes_DivergedIsIgnored) asserts the
new contract: a diverged volume produces no plan operations from the
reconciler.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Guillaume Lours <glours@users.noreply.github.com>
Two related changes to the executor, plus the small cleanups they
attracted in review:
* Rename node consults a planner-set CreateNodeID instead of walking
ancestors. The old execRenameContainer searched node.DependsOn for a
CreateContainer result and fell back to a recursive walk through the
group chain. That worked only by convention; a future op with cross-
node data needs would have to rediscover or copy the pattern. Now the
rename op carries an explicit CreateNodeID int set at plan time and
the executor reads pctx[CreateNodeID].ContainerID directly. The
recursive findCreatedIDInChain is gone.
* Stop re-listing containers on every create. execCreateContainer used
to call getContainersByService(ctx, projectName) — a fresh
ContainerList per create — to resolve service references at execute
time. The executor now holds a live containersByService view seeded
from ObservedState (via observed.containersByService()) and grown as
OpCreateContainer nodes complete, so service references resolve from
memory. On OpRemoveContainer the removed container is dropped from
the view via slices.DeleteFunc, so a dependent's create that resolves
network_mode: service:x against the just-removed container cannot
pick up a stale ID (Containers.sorted() orders by canonical name and
would otherwise return the removed container).
* Defensive slices.Clone of op.Service.VolumesFrom in execCreateContainer.
resolveServiceReferences mutates VolumesFrom in place, and the
shallow struct copy of *op.Service still shares the backing array.
Single-execution-per-node makes it safe today, but the clone removes
the trap for any future parallel-execution mode.
* Operation gains a CreateNodeID int (not a *PlanNode pointer) to avoid
a structural cycle between Operation and PlanNode. OperationType
values are pinned to explicit integers so adding an op in the middle
cannot silently shift the others.
* execRenameContainer carries two checks so a missing CreateNodeID and
an empty produced ID are distinguishable in logs. Both are programmer
invariants (prefixed "internal:").
* containersByServiceFromObserved moved from a package-level helper to
a method on *ObservedState.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Guillaume Lours <glours@users.noreply.github.com>
Three improvements identified in the Principal Engineer pass but
deliberately deferred:
1. Test fidelity. Split executePlan into newPlanExecutor (constructs
the executor seeded from observed state) and (*planExecutor).run
(walks the DAG). Production callers go through executePlan
unchanged. TestExecutePlanRemoveContainerDropsFromCache now uses
newPlanExecutor + run, exercising the same errgroup, done-channel
and group-tracker wiring as production instead of a hand-rolled
loop over executeNode.
2. //nolint:unused chain. The three preserved helpers
(reconciler.prompt, planRecreateVolume, servicesUsingVolume) each
carried a separate "kept for future" comment. Consolidate the
rationale on the reconciler.prompt field doc and point the helper
nolint directives there, so a future cleanup is a single grep.
3. Concurrency test. Add TestExecutePlanConcurrentRemovesCacheCoherence
which builds N independent Stop→Remove chains in one plan; the
errgroup fans them out across goroutines that all hit
containersByService under the mutex. Passes under -race. Failure
would expose a missing or incorrect lock.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Guillaume Lours <glours@users.noreply.github.com>
executor.go had grown to ~480 lines mixing three concerns:
- DAG orchestration (run, executeNode, planExecutor struct)
- per-OpType implementations (execCreateNetwork, …, execRenameContainer)
- event tracking (groupTracker + per-OpType emit helpers)
Split into three files of ~170 lines each, one concern per file:
- executor.go — planExecutor, reconciliationContext, run, executeNode dispatch
- executor_ops.go — all execXxx methods
- executor_events.go — groupTracker + emitStartEvent / emitDoneEvent / emitErrorEvent
Pure refactor: no functional change. Tests (incl. -race) and lint both pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Guillaume Lours <glours@users.noreply.github.com>
Three fixes surfaced by an external code review of the new reconciler:
1. Scale-down now propagates through serviceNodes. When a service is
scaled down (all containers in excess), reconcileService used to
continue without assigning lastNode, leaving r.serviceNodes[svc]
unset. Dependent services then declared no edge on the scale-down
ops and could start before the cleanup finished. Track the
RemoveContainer node as lastNode so depends_on chains pick it up.
2. mustRecreate errors are no longer silently ignored by sortContainers.
The comparator used `obsi, _ := r.mustRecreate(...)`, falling back
to false on any hashing error. Pre-compute obsolescence into a map
keyed by container ID before sorting and propagate the error to
reconcileService.
3. A container is no longer Stopped twice when its network and its
config both diverge. planRecreateNetwork already stops the affected
container as part of the disconnect/remove/recreate dance; the
subsequent planRecreateContainer (triggered via hasNetworkMismatch)
used to add another OpStopContainer against the now-stopped target.
Track stops in r.stoppedByPlan; planRecreateContainer reuses an
existing Stop node when present, and chains its Remove on both that
Stop and the replacement Create.
Two golden tests (TestReconcileNetworks_Diverged*) are updated to
reflect the new, dedupe'd plan shape (one Stop instead of two per
recreated container).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Guillaume Lours <glours@users.noreply.github.com>
Two coverage gaps surfaced by an external review:
- TestReconcileContainers_DependsOnChain: asserts that a service B with
depends_on: [A] produces a CreateContainer for B that depends on A's
last plan node (the serviceNodes mechanism in infrastructureDeps).
This was the only depends_on-via-plan-DAG behavior untested before.
- TestReconcileContainers_DependsOnScaleDown: companion test that
exercises the scale-down → dependent path specifically, verifying
that the previous commit's lastNode-on-scale-down fix actually wires
the dependency through.
- TestOperationTypeString: adds OpRunProvider to the table; all other
OperationType values were already covered.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Guillaume Lours <glours@users.noreply.github.com>
External reviewer noted that the alreadyStopped branch adds createNode
to removeDeps while the !alreadyStopped branch does not — semantically
correct but fragile, since it relies on the implicit invariant that
stopNode.DependsOn contains createNode in the !alreadyStopped path.
Spell out the invariant in a comment so a future maintainer who edits
the stop → create edge in the normal path knows they must also add
createNode unconditionally in the remove deps.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Guillaume Lours <glours@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 8, 2026 14:25
@glours
glours requested a review from a team as a code ownerJune 8, 2026 14:25
@glours
glours requested a review from ndeloofJune 8, 2026 14:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR introduces a new “reconciliation plan” architecture for Compose create/up-like behavior by snapshotting the current project state, computing a DAG plan of atomic operations (networks/volumes/containers/providers), and executing that plan via a dedicated executor. This is positioned as an alternative approach to PR #13641 to better guide a significant refactor and enable more deterministic, focused tests.

Changes:

  • Added a reconciler that compares desired vs observed state and produces a deterministic operation DAG (Plan).
  • Added a plan executor that runs the DAG with dependency ordering, concurrency, and grouped progress events (e.g., recreate).
  • Updated create/run flows to use observed-state collection and service-reference resolution without the previous convergence implementation; added extensive unit tests for plan/reconcile/executor behavior.

Reviewed changes

Copilot reviewed 14 out of 14 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
pkg/compose/run.goSwitches run service-reference resolution to use a containers-by-service snapshot helper.
pkg/compose/reconcile.goImplements the reconciler that builds a plan (DAG) from desired vs observed state.
pkg/compose/reconcile_test.goAdds unit tests covering network/volume/container/orphan reconciliation scenarios and deterministic plan output.
pkg/compose/plan.goIntroduces Plan/PlanNode and Operation types (the reconciliation DAG model).
pkg/compose/plan_test.goAdds tests for operation stringification and plan rendering/dependency formatting.
pkg/compose/observed_state.goAdds ObservedState snapshot collection and helpers used by reconciliation/execution.
pkg/compose/observed_state_test.goAdds tests validating observed-state extraction/classification from mocked API responses.
pkg/compose/executor.goIntroduces the DAG executor that schedules node execution and coordinates group events.
pkg/compose/executor_test.goAdds executor tests, including cache-coherence under concurrent remove operations.
pkg/compose/executor_ops.goImplements concrete Docker API calls for each operation type and maintains the live service-reference cache.
pkg/compose/executor_events.goAdds group-based progress event aggregation (e.g., “Recreate” Working/Done).
pkg/compose/create.goReplaces convergence-based apply with observed snapshot + reconcile(plan) + executePlan, and preserves “running” events.
pkg/compose/convergence.goRemoves the convergence orchestration and refactors service-reference resolution into standalone helpers.
pkg/compose/containers.goAdds getContainersByService helper; removes an unused Containers.names() helper.

Comment on lines +120 to +131
err := exec.executeNode(ctx, node)

if err == nil {
// Emit group done event if this is the last node of a group
groups.onNodeDone(node, events)
} else if ctx.Err() == nil {
groups.onNodeError(node, events, err)
}

close(done[node.ID])
return err
})
@docker-agent

Copy link
Copy Markdown

PR Review Failed — The review agent encountered an error and could not complete the review. View logs.

@ndeloof
ndeloof enabled auto-merge (rebase) June 8, 2026 14:36
auto-merge was automatically disabled June 8, 2026 14:37

Branch protection rule check failed

@glours
glours merged commit 77ec74e into docker:mainJun 8, 2026
42 checks passed
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Jul 9, 2026
This MR contains the following updates:
| Package | Update | Change |
|---|---|---|
| [docker/compose](https://github.com/docker/compose) | minor | `v5.1.4` → `v5.3.1` |
MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).
**Proposed changes to behavior should be submitted there as MRs.**
---
### Release Notes
<details>
<summary>docker/compose (docker/compose)</summary>
### [`v5.3.1`](https://github.com/docker/compose/releases/tag/v5.3.1)
[Compare Source](docker/compose@v5.3.0...v5.3.1)
#### What's Changed
##### 🔧 Internal
- Ci: add concurrency group to pr-review-trigger to prevent duplicate reviews by [@&#8203;derekmisler](https://github.com/derekmisler) in [#&#8203;13890](docker/compose#13890)
- Fix grammar in Attestations field comment by [@&#8203;blackflytech](https://github.com/blackflytech) in [#&#8203;13891](docker/compose#13891)
- Ci: remove unused desktop-edge-test workflow by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13897](docker/compose#13897)
- Ci: zizmor workflow by [@&#8203;crazy-max](https://github.com/crazy-max) in [#&#8203;13901](docker/compose#13901)
- Ci: fix docs-upstream workflow by [@&#8203;crazy-max](https://github.com/crazy-max) in [#&#8203;13912](docker/compose#13912)
- CODEOWNERS: add compose-reviewers by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13913](docker/compose#13913)
- Ci: harden GitHub Actions workflows by [@&#8203;glours](https://github.com/glours) in [#&#8203;13896](docker/compose#13896)
- GHA: dependabot: group docker/\* actions updates by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13914](docker/compose#13914)
##### ⚙️ Dependencies
- Build(deps): bump github.com/moby/buildkit from `0.31.0` to `0.31.1` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13892](docker/compose#13892)
- Build(deps): bump github.com/moby/sys/user to `v0.4.1` by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13893](docker/compose#13893)
- Build(deps): bump go.yaml.in/yaml/v4 from `4.0.0-rc.4` to `4.0.0-rc.6` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13876](docker/compose#13876)
- Build(deps): bump github.com/docker/cli from `29.6.0+incompatible` to `29.6.1+incompatible` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13895](docker/compose#13895)
- Build(deps): bump actions/stale from `10.2.0` to `10.3.0` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13902](docker/compose#13902)
- Build(deps): bump the docker-actions group with 3 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13916](docker/compose#13916)
- Build(deps): bump actions/upload-artifact from `7.0.0` to `7.0.1` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13908](docker/compose#13908)
- Build(deps): bump actions/setup-go from `6.3.0` to `6.5.0` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13907](docker/compose#13907)
- Build(deps): bump test-summary/action from `2.4` to `2.6` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13903](docker/compose#13903)
- Build(deps): bump mxschmitt/action-tmate from `3.23` to `3.24` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13910](docker/compose#13910)
- Build(deps): bump codecov/codecov-action from `5.5.3` to `7.0.0` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13904](docker/compose#13904)
- Build(deps): bump github/codeql-action/upload-sarif from `3.36.3` to `4.36.2` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13917](docker/compose#13917)
- Build(deps): bump actions/checkout from `6.0.2` to `7.0.0` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13911](docker/compose#13911)
#### New Contributors
- [@&#8203;blackflytech](https://github.com/blackflytech) made their first contribution in [#&#8203;13891](docker/compose#13891)
**Full Changelog**: <docker/compose@v5.3.0...v5.3.1>
### [`v5.3.0`](https://github.com/docker/compose/releases/tag/v5.3.0)
[Compare Source](docker/compose@v5.2.0...v5.3.0)
#### What's Changed
> ℹ️ This release introduces native support for init containers.
##### ✨ Improvements
- Pre start init containers by [@&#8203;glours](https://github.com/glours) in [#&#8203;13862](docker/compose#13862)
##### 🐛 Fixes
- Fix(oci): route authorizer token fetches through provided transport by [@&#8203;glours](https://github.com/glours) in [#&#8203;13873](docker/compose#13873)
- Fix(run): scope Running events to project.Services by [@&#8203;glours](https://github.com/glours) in [#&#8203;13883](docker/compose#13883)
##### 🔧 Internal
- Chore: migrate cagent-action to docker-agent-action (v2.0.0) by [@&#8203;docker-agent](https://github.com/docker-agent) in [#&#8203;13869](docker/compose#13869)
- Chore: migrate to docker-agent-action v2.0.1 by [@&#8203;docker-agent](https://github.com/docker-agent) in [#&#8203;13872](docker/compose#13872)
- Fix(reconcile): hash resolved service refs to match executor by [@&#8203;glours](https://github.com/glours) in [#&#8203;13880](docker/compose#13880)
- Fix(compose/port): show private port in portNotFoundError message by [@&#8203;vmphase](https://github.com/vmphase) in [#&#8203;13875](docker/compose#13875)
- Fix(run): normalize --no-TTY flag to --no-tty by [@&#8203;nickjj](https://github.com/nickjj) in [#&#8203;13885](docker/compose#13885)
##### ⚙️ Dependencies
- Bump compose-go to version v2.13.0 by [@&#8203;glours](https://github.com/glours) in [#&#8203;13886](docker/compose#13886)
#### New Contributors
- [@&#8203;docker-agent](https://github.com/docker-agent) made their first contribution in [#&#8203;13869](docker/compose#13869)
- [@&#8203;vmphase](https://github.com/vmphase) made their first contribution in [#&#8203;13875](docker/compose#13875)
- [@&#8203;nickjj](https://github.com/nickjj) made their first contribution in [#&#8203;13885](docker/compose#13885)
**Full Changelog**: <docker/compose@v5.2.0...v5.3.0>
### [`v5.2.0`](https://github.com/docker/compose/releases/tag/v5.2.0)
[Compare Source](docker/compose@v5.1.4...v5.2.0)
#### What's Changed
> ℹ️ This version introduces a new reconciliation algorithm between the observed state and the expected state.
>
> If you experience any issues with a Compose workload that was previously working, please open an issue.
##### ✨ Improvements
- Reconciliation plan by [@&#8203;ndeloof](https://github.com/ndeloof) & [@&#8203;glours](https://github.com/glours) in [#&#8203;13830](docker/compose#13830)
- Add `rawsetenv` message type for provider plugins by [@&#8203;rajyan](https://github.com/rajyan) in [#&#8203;13742](docker/compose#13742)
##### 🐛 Fixes
- Fix(build): skip remote URL contexts from bake fs.read allowlist by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13816](docker/compose#13816)
- Skip validation when extracting config variables by [@&#8203;scarab-systems](https://github.com/scarab-systems) in [#&#8203;13831](docker/compose#13831)
- Fix(progress): probe stderr (not stdout) for TTY auto-detection by [@&#8203;glours](https://github.com/glours) in [#&#8203;13837](docker/compose#13837)
- Fix(publish): honor env\_file required: false for missing files by [@&#8203;Ijtihed](https://github.com/Ijtihed) in [#&#8203;13848](docker/compose#13848)
##### 🔧 Internal
- Docs: compose logs: add links for since/until flag descriptions by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13806](docker/compose#13806)
- Ci: add Dependabot cooldown ([`2026060`](docker/compose@20260603)-170456) by [@&#8203;securityeng-bot](https://github.com/securityeng-bot)\[bot] in [#&#8203;13820](docker/compose#13820)
- Docs(CLAUDE.md): note that commits must be signed off (DCO) by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13817](docker/compose#13817)
- Refactor: replace Split in loops with more efficient SplitSeq and replace HasPrefix+TrimPrefix with CutPrefix by [@&#8203;caltechustc](https://github.com/caltechustc) in [#&#8203;13810](docker/compose#13810)
- Chore: fix some comments to improve readability by [@&#8203;solunolab](https://github.com/solunolab) in [#&#8203;13823](docker/compose#13823)
- GHA: update docs-upstream to pin workflows by sha by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13834](docker/compose#13834)
- Docs: compose logs: add more links for flag descriptions by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13833](docker/compose#13833)
- Fix/progress tty line overflow 13595 by [@&#8203;glours](https://github.com/glours) in [#&#8203;13840](docker/compose#13840)
- Fix(publish): bypass Docker Desktop proxy for loopback registries by [@&#8203;ptrdom](https://github.com/ptrdom) in [#&#8203;13825](docker/compose#13825)
- Watch: do not rebuild depends\_on services on file change by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13856](docker/compose#13856)
- pkg/e2e: fix malformed JWT in fixtures by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13857](docker/compose#13857)
- pkg/e2e: drop unused run param from getEnv by [@&#8203;glours](https://github.com/glours) in [#&#8203;13867](docker/compose#13867)
- Docs: `ps --format json` outputs JSON Lines, not a JSON array by [@&#8203;glours](https://github.com/glours) in [#&#8203;13868](docker/compose#13868)
##### ⚙️ Dependencies
- Build(deps): bump github.com/docker/cli from `29.5.1+incompatible` to `29.5.2+incompatible` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13802](docker/compose#13802)
- Update to go `1.26.4` by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13828](docker/compose#13828)
- Chore(deps): github.com/containerd/typeurl/v2 `v2.3.0` by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13829](docker/compose#13829)
- Build(deps): bump golang.org/x/sync from `0.20.0` to `0.21.0` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13838](docker/compose#13838)
- Chore(deps): github.com/docker/cli `v29.5.3`, github.com/docker/buildx `v0.34.1`, buildkit `v0.30.0` by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13841](docker/compose#13841)
- Build(deps): bump golang.org/x/sys from `0.45.0` to `0.46.0` by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13832](docker/compose#13832)
- Chore(deps): golang.org/x/crypto `v0.53.0` by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13844](docker/compose#13844)
- Build(deps): bump github.com/containerd/containerd/v2 from `2.2.3` to `2.2.4` in the go\_modules group across 1 directory by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13804](docker/compose#13804)
- Chore(deps): bump github.com/containerd/containerd/v2 to `v2.2.5` by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13855](docker/compose#13855)
- Chore(deps): bump github.com/golang-jwt/jwt/v5 to `v5.3.1` by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13847](docker/compose#13847)
- Chore(deps): github.com/docker/cli `v29.6.0`, github.com/docker/buildx `v0.35.0`, buildkit `v0.31.0` by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13842](docker/compose#13842)
- Bump compose-go to version `v2.12.1` by [@&#8203;glours](https://github.com/glours) in [#&#8203;13865](docker/compose#13865)
#### New Contributors
- [@&#8203;securityeng-bot](https://github.com/securityeng-bot)\[bot] made their first contribution in [#&#8203;13820](docker/compose#13820)
- [@&#8203;caltechustc](https://github.com/caltechustc) made their first contribution in [#&#8203;13810](docker/compose#13810)
- [@&#8203;solunolab](https://github.com/solunolab) made their first contribution in [#&#8203;13823](docker/compose#13823)
- [@&#8203;scarab-systems](https://github.com/scarab-systems) made their first contribution in [#&#8203;13831](docker/compose#13831)
- [@&#8203;ptrdom](https://github.com/ptrdom) made their first contribution in [#&#8203;13825](docker/compose#13825)
- [@&#8203;rajyan](https://github.com/rajyan) made their first contribution in [#&#8203;13742](docker/compose#13742)
- [@&#8203;Ijtihed](https://github.com/Ijtihed) made their first contribution in [#&#8203;13848](docker/compose#13848)
**Full Changelog**: <docker/compose@v5.1.4...v5.2.0>
</details>
---
### Configuration
📅 **Schedule**: (UTC)
- Branch creation
- At any time (no schedule defined)
- Automerge
- At any time (no schedule defined)
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this MR and you won't be reminded about this update again.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box
---
This MR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNTYuMCIsInVwZGF0ZWRJblZlciI6IjQzLjI1Ni4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiLCJhdXRvbWF0aW9uOmJvdC1hdXRob3JlZCIsImRlcGVuZGVuY3ktdHlwZTo6bWlub3IiXX0=-->
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@glours@ndeloof