Skip to content

Conversation

@glours
Copy link
Contributor

@glours glours commented Oct 29, 2025

What I did
introduces a new LoadProject method to the Compose API, enabling programmatic loading of Compose projects with full control over the loading process.

Related issue
#13230

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

@glours glours requested a review from a team as a code owner October 29, 2025 18:06
@glours glours requested a review from ndeloof October 29, 2025 18:06
@glours glours self-assigned this Oct 29, 2025
@glours glours force-pushed the add-LoadProject-to-sdk branch 2 times, most recently from 915e976 to ee7bd60 Compare October 29, 2025 18:09
@glours glours force-pushed the add-LoadProject-to-sdk branch 2 times, most recently from bc45e72 to bf0a5ac Compare October 29, 2025 19:09
@glours glours changed the title Add load project to sdk Add load project to api definition Oct 29, 2025
@ndeloof ndeloof enabled auto-merge (rebase) November 3, 2025 07:06
@ndeloof ndeloof force-pushed the add-LoadProject-to-sdk branch from 2b5161c to 9af6576 Compare November 3, 2025 07:43
This commit adds a new LoadProject method to the Compose service API,
allowing SDK users to programmatically load Compose projects with full
control over the loading process.

Changes:

1. New API method (pkg/api/api.go):
   - LoadProject(ctx, ProjectLoadOptions) (*types.Project, error)
   - ProjectLoadOptions struct with all loader configuration
   - LoadListener callback for event notifications (metrics, etc.)
   - ProjectOptionsFns field for compose-go loader options

2. Implementation (pkg/compose/loader.go):
   - createRemoteLoaders: Git and OCI remote loader setup
   - buildProjectOptions: Translates ProjectLoadOptions to compose-go options
   - postProcessProject: Service filtering, labels, resource pruning

3. Unit test (pkg/compose/loader_test.go):
   - Tests basic project loading functionality
   - Verifies ProjectOptionsFns with cli.WithoutEnvironmentResolution

4. Mock update (pkg/mocks/mock_docker_compose_api.go):
   - Added LoadProject to mock interface

Key design decisions:
- LoadListener pattern keeps metrics collection in CLI, not SDK
- ProjectOptionsFns exposes compose-go options directly (e.g., cli.WithInterpolation(false))
- Post-processing in SDK: labels, service filtering, resource pruning
- Environment resolution NOT in SDK (command responsibility)
- Compatibility mode handling (api.Separator)

Signed-off-by: Guillaume Lours <[email protected]>
Simplifying the codebase and eliminating duplicate backend creation.

Signed-off-by: Guillaume Lours <[email protected]>
@ndeloof ndeloof force-pushed the add-LoadProject-to-sdk branch 2 times, most recently from 794f87c to 198b357 Compare November 3, 2025 07:45
@ndeloof ndeloof merged commit b80bb05 into docker:main Nov 3, 2025
23 checks passed
@ndeloof ndeloof deleted the add-LoadProject-to-sdk branch November 3, 2025 07:58
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Dec 12, 2025
⚠️ **CAUTION: this is a major update, indicating a breaking change!** ⚠️

This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [docker/compose](https://github.com/docker/compose) | major | `v2.40.3` -> `v5.0.0` |

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.0.0`](https://github.com/docker/compose/releases/tag/v5.0.0): &quot;Mont Blanc&quot;

[Compare Source](docker/compose@v2.40.3...v5.0.0)

![mont blanc](https://github.com/user-attachments/assets/1e6b938e-e67a-4063-b1d0-0f225da01521)

Major changes in this release:

- Compose can now officially be used as a SDK to be integrated into third-party softwares
- Internal builder has been removed, build is delegated to Docker Bake (same as `docker build` command)

#### Why "v5" ?

We decided to skip `3.0.0` for next major release after docker Compose v2 to prevent (more) confusion with the obsolete docker-compose file versions `2.x` and `3.x` inherited from Docker Compose v1. We also skipped `4.0.0` to have a clear separation with this legacy.

#### What's Changed

##### ✨ Improvements

- drop support for internal buildkit builder by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13056](docker/compose#13056)
- Setup Compose service using functional parameters by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13312](docker/compose#13312)
- Introduce abstractions to support SDK usage without requiring Docker CLI by [@&#8203;glours](https://github.com/glours) in [#&#8203;13313](docker/compose#13313)
- configure Compose service with io.Reader and io.Writer by [@&#8203;glours](https://github.com/glours) in [#&#8203;13322](docker/compose#13322)
- Make progress Writer a CLI component by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13316](docker/compose#13316)
- SDK docs by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13350](docker/compose#13350)
- document support for OCI and Git remote resources by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13362](docker/compose#13362)
- run hooks on restart by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13321](docker/compose#13321)
- fix(run): Ensure images exist only for the target service in run command by [@&#8203;idsulik](https://github.com/idsulik) in [#&#8203;13325](docker/compose#13325)
- Add load project to api definition by [@&#8203;glours](https://github.com/glours) in [#&#8203;13329](docker/compose#13329)
- introduce --insecure-registry, reserved for testing purpose by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13355](docker/compose#13355)
- Move progress package to cmd as a command line component by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13357](docker/compose#13357)
- Added support for `build.no_cache_filter` by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13377](docker/compose#13377)
- add --wait option to start command by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13409](docker/compose#13409)

##### 🐛 Fixes

- fix OCI compose override support by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13311](docker/compose#13311)
- Fix help output for "exec --no-tty" option by [@&#8203;tonyo](https://github.com/tonyo) in [#&#8203;13314](docker/compose#13314)
- fix typo in error message by [@&#8203;stasadev](https://github.com/stasadev) in [#&#8203;13328](docker/compose#13328)
- disable progress UI when build is ran with --print by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13351](docker/compose#13351)
- add (restore) support for detach keys by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13369](docker/compose#13369)
- images command should display image Created time or N/A if not available by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13376](docker/compose#13376)
- Fix support for port range by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13381](docker/compose#13381)
- skip includes preparing publish by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13400](docker/compose#13400)
- feat(model): ignore runtime flags in model configuration by [@&#8203;ilopezluna](https://github.com/ilopezluna) in [#&#8203;13404](docker/compose#13404)

##### 🔧  Internal

- Next release will be major version v5.x by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13375](docker/compose#13375)
- Test to check writeComposeFile detects invalid OCI artifact by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13309](docker/compose#13309)
- Code Cleanup by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13315](docker/compose#13315)
- fix various linting issues by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13326](docker/compose#13326)
- Making the American/British spellings consistent to the error messages by [@&#8203;JLesDev](https://github.com/JLesDev) in [#&#8203;13366](docker/compose#13366)
- gha: test against docker v29, v28, and rename checks to use `stable`, `oldstable` by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13380](docker/compose#13380)
- refactor: replace Split in loops with more efficient SplitSeq by [@&#8203;vicerace](https://github.com/vicerace) in [#&#8203;13393](docker/compose#13393)
- refactor: use strings.Builder to improve performance by [@&#8203;liuyueyangxmu](https://github.com/liuyueyangxmu) in [#&#8203;13398](docker/compose#13398)
- Fix grammar: change 'adopted' to 'adopt' in Docker Swarm note by [@&#8203;rashmivagha](https://github.com/rashmivagha) in [#&#8203;13407](docker/compose#13407)
- golangci-lint: use gci formatter instead of goimports by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13406](docker/compose#13406)
- refactor: replace interface{} with any for clarity and modernization by [@&#8203;zjumathcode](https://github.com/zjumathcode) in [#&#8203;13411](docker/compose#13411)

##### ⚙️ Dependencies

- Bump compose go to v2.10.0 by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13410](docker/compose#13410)
- build(deps): bump github.com/containerd/platforms from 1.0.0-rc.1 to 1.0.0-rc.2 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13353](docker/compose#13353)
- build(deps): bump github.com/docker/docker from 28.5.1+incompatible to 28.5.2+incompatible by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13361](docker/compose#13361)
- build(deps): bump github.com/containerd/containerd/v2 from 2.1.4 to 2.2.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13358](docker/compose#13358)
- build(deps): bump github.com/docker/cli from 28.5.1+incompatible to 28.5.2+incompatible by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13360](docker/compose#13360)
- build(deps): bump golang.org/x/sys from 0.37.0 to 0.38.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13367](docker/compose#13367)
- build(deps): bump golang.org/x/sync from 0.17.0 to 0.18.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13368](docker/compose#13368)
- Dockerfile: update golangci-lint to v2.6.2 by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13370](docker/compose#13370)
- build(deps): bump buildx v0.30.0, buildkit v0.26.0, otel v1.38.0, otel/contrib v0.63.0 by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13379](docker/compose#13379)
- bump dependencies by [@&#8203;ndeloof](https://github.com/ndeloof) in [#&#8203;13392](docker/compose#13392)
- build(deps): bump github.com/hashicorp/go-version from 1.7.0 to 1.8.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13403](docker/compose#13403)
- build(deps): bump golang.org/x/crypto v0.45.0 by [@&#8203;thaJeztah](https://github.com/thaJeztah) in [#&#8203;13405](docker/compose#13405)

#### New Contributors

- [@&#8203;tonyo](https://github.com/tonyo) made their first contribution in [#&#8203;13314](docker/compose#13314)
- [@&#8203;stasadev](https://github.com/stasadev) made their first contribution in [#&#8203;13328](docker/compose#13328)
- [@&#8203;JLesDev](https://github.com/JLesDev) made their first contribution in [#&#8203;13366](docker/compose#13366)
- [@&#8203;vicerace](https://github.com/vicerace) made their first contribution in [#&#8203;13393](docker/compose#13393)
- [@&#8203;liuyueyangxmu](https://github.com/liuyueyangxmu) made their first contribution in [#&#8203;13398](docker/compose#13398)
- [@&#8203;ilopezluna](https://github.com/ilopezluna) made their first contribution in [#&#8203;13404](docker/compose#13404)
- [@&#8203;rashmivagha](https://github.com/rashmivagha) made their first contribution in [#&#8203;13407](docker/compose#13407)
- [@&#8203;zjumathcode](https://github.com/zjumathcode) made their first contribution in [#&#8203;13411](docker/compose#13411)

**Full Changelog**: <docker/compose@v2.40.2...v5.0.0>

</details>

---

### Configuration

📅 **Schedule**: 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 [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi4zMC40IiwidXBkYXRlZEluVmVyIjoiNDIuMzAuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiUmVub3ZhdGUgQm90Il19-->
Sign up for free to 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.

2 participants