compose/pkg/api
Milas Bowman 1fdbcb6255 build: pass BuildOptions around explicitly & fix multi-platform issues
The big change here is to pass around an explicit `*BuildOptions` object
as part of Compose operations like `up` & `run` that may or may not do
builds. If the options object is `nil`, no builds whatsoever will be
attempted.

Motivation is to allow for partial rebuilds in the context of an `up`
for watch. This was broken and tricky to accomplish because various parts
of the Compose APIs mutate the `*Project` for convenience in ways that
make it unusable afterwards. (For example, it might set `service.Build = nil`
because it's not going to build that service right _then_. But we might
still want to build it later!)

NOTE: This commit does not actually touch the watch logic. This is all
      in preparation to make it possible.

As part of this, a bunch of code moved around and I eliminated a bunch
of partially redundant logic, mostly around multi-platform. Several
edge cases have been addressed as part of this:
 * `DOCKER_DEFAULT_PLATFORM` was _overriding_ explicitly set platforms
   in some cases, this is no longer true, and it behaves like the Docker
   CLI now
 * It was possible for Compose to build an image for one platform and
   then try to run it for a different platform (and fail)
 * Errors are no longer returned if a local image exists but for the
   wrong platform - the correct platform will be fetched/built (if
   possible).

Because there's a LOT of subtlety and tricky logic here, I've also tried
to add an excessive amount of explanatory comments.

Signed-off-by: Milas Bowman <milas.bowman@docker.com>
2023-09-01 08:32:56 +02:00
..
api.go build: pass BuildOptions around explicitly & fix multi-platform issues 2023-09-01 08:32:56 +02:00
api_test.go move compose API into pkg/api 2021-06-15 15:52:48 +02:00
dryrunclient.go pkg/api: replace uuid for basic random id 2023-08-31 10:13:32 +02:00
errors.go Add gocritic to linters 2022-07-13 19:33:03 +02:00
errors_test.go move compose API into pkg/api 2021-06-15 15:52:48 +02:00
io.go don't assume os.Stdout and rely on dockerCLI.streams 2022-12-20 23:52:25 +01:00
labels.go detect replacement container is created and inform printer so it attach and don't stop 2023-02-06 11:23:13 +01:00
proxy.go fix some comments 2023-07-04 11:34:49 +08:00